我无法通过另一个集合中聚合的对象字段过滤查找结果。
我具有以下聚合函数:
db.Persons.aggregate([
{ $lookup:
{
from: "Addresses",
localField: "addressId",
foreignField: "_id",
as: "address"
}
},
{ $unwind: "$address" }
])
返回类似:
{
"_id" : "5dfa9",
"addressId" : ObjectId("5df95bd35a65a59142faa6be"),
"text" : "abc",
"address" :
{
"_id" : ObjectId("5df95bd35a65a59142faa6be"),
"townId" : "3"
}
}
当我添加$match
时:
db.Persons.aggregate([
{ $match: { address: { $elemMatch: { "townId": "3" } } } },
{ $lookup: { ... } },
{ $unwind: "$address" }
])
我什么也没得到。但是,添加像这样的匹配{ $match: { text: "abc" } }
效果很好。
我认为问题是$elemMatch: { "townId": "3" } }
正在返回整个文档,而不仅仅是返回地址。您无法将地址字段匹配到整个文档,这可能是您不返回任何结果的原因。
var searchAddress = db.collection.find({ <array field name>: { $elemMatch: { "townId": "3" } } } ).<address field name>
然后传递searchAddress
输入
$match: { address: searchAddress }