Có, có hai cách để làm điều này. Vì vậy, bạn có thể sử dụng $ elemMatch
về mặt chiếu như bạn đã có, với những thay đổi nhỏ:
Model.findById(id,
{ "comments": { "$elemMatch": {"created.by": "Jane" } } },
function(err,doc) {
Hoặc chỉ cần thêm vào phần truy vấn và sử dụng $
vị trí nhà điều hành:
Model.findOne(
{ "_id": id, "comments.created.by": "Jane" },
{ "comments.$": 1 },
function(err,doc) {
Cách nào cũng hoàn toàn hợp lệ.
Nếu bạn muốn điều gì đó liên quan hơn một chút, bạn có thể sử dụng .aggregate ()
và đó là $ project
toán tử thay thế:
Model.aggregate([
// Still match the document
{ "$match": "_id": id, "comments.created.by": "Jane" },
// Unwind the array
{ "$unwind": "$comments" },
// Only match elements, there can be more than 1
{ "$match": "_id": id, "comments.created.by": "Jane" },
// Project only what you want
{ "$project": {
"comments": {
"body": "$comments.body",
"by": "$comments.created.by"
}
}},
// Group back each document with the array if you want to
{ "$group": {
"_id": "$_id",
"comments": { "$push": "$comments" }
}}
],
function(err,result) {
Vì vậy, khung tổng hợp có thể được sử dụng cho nhiều mục đích hơn là chỉ tổng hợp các kết quả. Đó là $ project
toán tử cung cấp cho bạn sự linh hoạt hơn so với phép chiếu sử dụng .find ()
. Nó cũng cho phép bạn lọc và trả về nhiều kết quả mảng, đây cũng là điều không thể thực hiện được với phép chiếu trong .find ()
.