Bạn có thể sử dụng $elemMatch
dưới dạng toán tử chiếu truy vấn trong các phiên bản MongoDB gần đây nhất. Từ shell mongo:
db.parents.find(
{'children.age': {$gte: 18}},
{children:{$elemMatch:{age: {$gte: 18}}}})
Điều này lọc các tài liệu dành cho trẻ nhỏ hơn ra khỏi children
mảng:
{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
{ "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }
Như bạn có thể thấy, trẻ em vẫn được nhóm bên trong tài liệu mẹ của chúng. Truy vấn MongoDB trả về tài liệu từ bộ sưu tập. Bạn có thể sử dụng $unwind
của khung tổng hợp phương pháp chia chúng thành các tài liệu riêng biệt:
> db.parents.aggregate({
$match: {'children.age': {$gte: 18}}
}, {
$unwind: '$children'
}, {
$match: {'children.age': {$gte: 18}}
}, {
$project: {
name: '$children.name',
age:'$children.age'
}
})
{
"result" : [
{
"_id" : ObjectId("51a7bf04dacca8ba98434eb5"),
"name" : "Margaret",
"age" : 20
},
{
"_id" : ObjectId("51a7bf04dacca8ba98434eb6"),
"name" : "John",
"age" : 22
}
],
"ok" : 1
}
Tôi lặp lại $match
mệnh đề về hiệu suất:lần đầu tiên thông qua nó loại bỏ các bậc cha mẹ có không trẻ em từ 18 tuổi trở lên, vì vậy $unwind
chỉ xem xét các tài liệu hữu ích. $match
thứ hai loại bỏ $unwind
đầu ra không khớp và $project
đưa thông tin của trẻ em từ các tài liệu phụ lên cấp cao nhất.