Những gì bạn thấy trong kết quả là chính xác. Cách tiếp cận của bạn hơi sai. Nếu bạn muốn có kết quả như mong đợi, thì bạn nên sử dụng phương pháp này:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Với điều này, bạn sẽ nhận được kết quả sau:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Bất cứ khi nào bạn sử dụng aggregation
trong MongoDB và muốn tạo một đường dẫn tổng hợp mang lại các tài liệu mà bạn mong đợi, bạn phải luôn bắt đầu truy vấn của mình với giai đoạn đầu tiên. Và cuối cùng thêm các giai đoạn để theo dõi kết quả đầu ra từ các giai đoạn tiếp theo.
Đầu ra của $unwind
của bạn giai đoạn sẽ là:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Bây giờ nếu chúng tôi bao gồm giai đoạn thứ ba mà bạn đã sử dụng, thì giai đoạn này sẽ khớp với greetings
khóa có giá trị {hello:"world"}
và với giá trị chính xác đó, nó sẽ chỉ tìm thấy hai tài liệu trong đường dẫn. Vì vậy, bạn sẽ chỉ nhận được:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }