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
}
}
])