文件就是这样。
{ username : 'Fred', address : [ {country : 'USA'}, {country : 'Canada'}] }
{ username : 'James', address : [ {country : 'Canada'}, {country : 'Vietnam'}] }
{ username : 'Sally', address : [ {country : 'Vietnam'}] }
{ username : 'Alice', address : [ {country : 'USA'}] }
我想查询北美地址的任何记录,即。加拿大或美国,并返回匹配的位置作为文档的顶级元素。
我发现最接近运行查询的是this,它返回匹配的第一条记录的整个地址文档:
coll.find(
{address: {$elemMatch : {country : {$in : ['USA', 'Canada']}}},
{'username': 1, 'address.$' :1 }
)
返回例如。
{ username : 'Fred', address : [ {country : 'USA'} ] }
但有没有办法将国家直接投射到文件中?即
{ username : 'Fred', address.country : 'USA' }
理想情况下类似于'address.$.country'
(但这似乎不起作用)。 'address.$.0.country'
..
答案 0 :(得分:0)
不,你不能使用find来做到这一点,因为在投影operator中没有这样的东西。为什么不在应用层上执行此操作?
P.S。可能有一种方法可以通过聚合实现这一目标。
答案 1 :(得分:0)
正如Salvador Dali所提到的那样,投影算子不可能得到它。以下聚合查询可能会帮助您获得所需的结果。
db.myObject.aggregate(
{$unwind : "$address"},
{$match : {"address.country" : {$in : ["USA", "Canada"]}}}
);
结果返回如下:
"result" : [
{
"_id" : ObjectId("5296faf86bdafa216cab1738"),
"username" : "Fred",
"address" : {
"country" : "USA"
}
},
{
"_id" : ObjectId("5296faf86bdafa216cab1738"),
"username" : "Fred",
"address" : {
"country" : "Canada"
}
},
{
"_id" : ObjectId("5296fb056bdafa216cab1739"),
"username" : "James",
"address" : {
"country" : "Canada"
}
},
{
"_id" : ObjectId("5296fb186bdafa216cab173b"),
"username" : "Alice",
"address" : {
"country" : "USA"
}
}
]