Anda dapat menggunakan $cond
operator dalam $project panggung untuk mengganti attr yang kosong array dengan yang berisi placeholder seperti null yang dapat digunakan sebagai penanda untuk menunjukkan bahwa dokumen ini tidak mengandung attr elemen.
Jadi, Anda akan memasukkan $project tambahan panggung seperti ini tepat sebelum $unwind :
{
$project: {
attrs: {$cond: {
if: {$eq: ['$attrs', [] ]},
then: [null],
else: '$attrs'
}}
}
},
Satu-satunya peringatan adalah bahwa Anda akan berakhir dengan null nilai dalam attrs terakhir array untuk grup yang berisi setidaknya satu dokumen tanpa attrs elemen, jadi Anda harus mengabaikan sisi klien tersebut.
Contoh
Contoh menggunakan $match . yang diubah panggung karena yang ada di contoh Anda tidak valid.
Masukkan Dokumen
[
{_id: {type: 1, id: 2}, attrs: []},
{_id: {type: 2, id: 1}, attrs: []},
{_id: {type: 2, id: 2}, attrs: [{name: 'john', type: 22}, {name: 'bob', type: 44}]}
]
Keluaran
{
"result" : [
{
"_id" : 1,
"attrs" : [
null
]
},
{
"_id" : 2,
"attrs" : [
{
"name" : "bob",
"type" : 44
},
{
"name" : "john",
"type" : 22
},
null
]
}
],
"ok" : 1
}
Perintah Agregat
db.test.aggregate([
{
$match: {
'_id.servicePath': {
$in: [
null
]
}
}
},
{
$project: {
_id: 1,
"attrs.name": 1,
"attrs.type": 1
}
},
{
$project: {
attrs: {$cond: {
if: {$eq: ['$attrs', [] ]},
then: [null],
else: '$attrs'
}}
}
},
{
$unwind: "$attrs"
},
{
$group: {
_id: "$_id.type",
attrs: {
$addToSet: "$attrs"
}
}
},
{
$sort: {
_id: 1
}
}
])