考虑名为“CityAssociation”
的集合中的以下文档{
"_id" : "MY_ID",
"ThisCityID" : "001",
"CityIDs" : [{
"CityID" : "001",
"CityName" : "Bangalore"
}, {
"CityID" : "002",
"CityName" : "Mysore"
}],
"CityUserDetails": {
"User" : "ABCD"
}
}
现在我有User
值,即在上面的情况下,我有值ABCD
,并希望仅在第一级的字段ThisCityID
与嵌入式数组documnet的字段匹配的城市中找到它{ {1}}。最后,我需要按如下方式进行投影(对于上述情况):
CityID
在Node.js + MongoDB本机驱动器中,我写了一个如下聚合查询,但是没有按预期工作。
{
'UserName': 'ABCD',
'HomeTown':'Bangalore'
}
任何人都可以告诉我如何通过查询来完成。
注意:在MongoDB架构中,我们没有控制权来更改它。
答案 0 :(得分:2)
您可以使用$eq
运算符检查第一级字段ThisCityID是否与嵌入式数组文档的字段CityID匹配。
db.city.aggregate([
{ $match : { "CityUserDetails.User" : "ABCD" }},
{ $unwind : "$CityIDs" },
{ $project : {
matches : { $eq: ["$CityIDs.CityID","$ThisCityID"]},
UserName : "$CityUserDetails.User",
HomeTown : "$CityIDs.CityName"
}},
{ $match : { matches : true }},
{ $project : {
_id : 0,
UserName : 1,
HomeTown : 1
}},
])
结果是:
{
"result" : [
{
"UserName" : "ABCD",
"HomeTown" : "Bangalore"
}
],
"ok" : 1
}