Bạn đã không còn xa giải pháp đầy đủ với khung tổng hợp - bạn cần một thứ nữa trước $group
bước và đó là thứ cho phép bạn xem liệu tất cả những thứ đang được sử dụng có khớp với thứ được sở hữu hay không.
Đây là toàn bộ đường dẫn
> db.house.aggregate(
{'$unwind':'$uses'},
{'$unwind':'$rooms'},
{'$unwind':'$rooms.owns'},
{$project: { _id:0,
houseId:1,
uses:"$uses.name",
isOkay:{$cond:[{$eq:["$uses.name","$rooms.owns.name"]}, 1, 0]}
}
},
{$group: { _id:{house:"$houseId",item:"$uses"},
hasWhatHeUses:{$sum:"$isOkay"}
}
},
{$match:{hasWhatHeUses:0}})
và đầu ra của nó trên tài liệu của bạn
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Giải thích - sau khi bạn mở cả hai mảng, bây giờ bạn muốn gắn cờ các phần tử trong đó mục đã sử dụng bằng với mục sở hữu và cho chúng một "điểm" khác 0. Bây giờ khi bạn tập hợp lại mọi thứ theo từng nhà, bạn có thể kiểm tra xem có bất kỳ mục nào đã sử dụng không khớp với nhau hay không. Sử dụng 1 và 0 cho điểm cho phép bạn tính tổng và bây giờ một kết quả phù hợp với mục có tổng bằng 0 có nghĩa là nó đã được sử dụng nhưng không khớp với bất kỳ thứ gì trong "sở hữu". Hy vọng bạn thích điều này!