Sử dụng $
toán tử vị trí, bạn có thể nhận được kết quả. Tuy nhiên, nếu bạn có nhiều phần tử trong vehicles
mảng tất cả chúng sẽ được trả về trong kết quả, vì bạn chỉ có thể sử dụng một toán tử vị trí trong phép chiếu và bạn đang làm việc với 2 mảng (một bên trong một mảng khác).
Tôi khuyên bạn nên xem qua aggregation framework
, vì bạn sẽ linh hoạt hơn rất nhiều. Đây là một truy vấn ví dụ cho câu hỏi của bạn chạy trong shell. Tôi không quen với mongoose, nhưng tôi đoán điều này vẫn sẽ giúp ích cho bạn và bạn có thể dịch nó:
db.collection.aggregate([
// Get only the documents where "email" equals "[email protected]" -- REPLACE with params.username
{"$match" : {email : "[email protected]"}},
// Unwind the "inventories" array
{"$unwind" : "$inventories"},
// Get only elements where "inventories.title" equals "activeInventory"
{"$match" : {"inventories.title":"activeInventory"}},
// Unwind the "vehicles" array
{"$unwind" : "$inventories.vehicles"},
// Filter by vehicle ID -- REPLACE with vehicleID
{"$match" : {"inventories.vehicles._id":ObjectId("53440e94c02b3cae81eb0069")}},
// Tidy up the output
{"$project" : {_id:0, vehicle:"$inventories.vehicles"}}
])
Đây là đầu ra bạn sẽ nhận được:
{
"result" : [
{
"vehicle" : {
"_id" : ObjectId("53440e94c02b3cae81eb0069"),
"tags" : [
"vehicle"
],
"details" : [
{
"_id" : ObjectId("53440e94c02b3cae81eb0066"),
"year" : 2007,
"transmission" : "Manual",
"price" : 1000,
"model" : "Firecar",
"mileageReading" : 50000,
"make" : "Bentley",
"interiorColor" : "blue",
"history" : "CarProof",
"exteriorColor" : "blue",
"driveTrain" : "SWD",
"description" : "test vehicle",
"cylinders" : 4,
"mileageType" : "kms"
}
]
}
}
],
"ok" : 1
}