arr=[{field1:<value1>,field2:<value2}.....]
我想对$in
的{{1}}使用field1
运算符。我知道我可以创建一个虚拟数组并推送虚拟数组中的arr
值。但有没有办法使用field1
运算符对阵列的特定字段?
$in
数组与集合无关。
我想查询特定字段上的所有文档,其值在arr
field1
中 - field1应位于运算符arr
的右侧
示例:
$in
输出应包含在arr=[{name:'foo',location:'NY'},{name:'bar',location:'LA'},{name:'foobar',location:'NZ'}]
db.collection.find({fieldx:<Here I want some method to obtain all documents whose fieldx values are in the location field of arr>})
的{{1}}字段中显示fieldx
值的文档。
查询的输出应为
location
arr
是我正在查询的集合中的字段。它不是我提供的数组([{...
fieldx:'NY',
...
},
{...
fieldx:'LA',
...
},
{...
fieldx:'NZ',
...
}]
)的字段。我希望将其与数组的字段{fieldx
)匹配 - arr
我提供查询。
答案 0 :(得分:9)
您需要提取&#34;位置&#34;输入数组中的字段并将其提供给 $in
:
var locs = arr.map(function(x) { return x.location } );
db.collection.find({ "fieldx": { "$in": locs } })
此处参考我将为您重新编写您的问题:
我有一个包含这样的文档的集合:
{ "fieldx": "NY" }
{ "fieldx": "LA" }
{ "fieldx": "SF" }
我所拥有的输入数组是这样定义的:
var arr = [
{ "name": "foo", "location": "NY"},
{ "name": "bar", "location": "LA"},
{ "name": "foobar", "location": "NZ"}
];
现在我想编写一个查询来查找与&#34; location&#34;匹配的所有文档。我输入的数组中的字段。
我该怎么做?
我试过了:
db.collection.find({ "fieldx": { "$in": arr } })
但那不匹配。
答案 1 :(得分:2)
扩展Neil Lunn的答案,你也可以在查询中使用map
函数。
var arr = [
{ "name": "foo", "location": "NY"},
{ "name": "bar", "location": "LA"},
{ "name": "foobar", "location": "NZ"}
];
db.collection.find({ "fieldx": { "$in": arr.map(function(x) { return x.location } ) } })
如果您使用ES6语法,那么
db.collection.find({ "fieldx": { "$in": arr.map(x => x.location ) } })
答案 2 :(得分:1)
您需要使用dot notation来选择数组中的字段:
db.coll.find({"arr.field1" : { $in : [ 'value1', 'value11' ]}});
此查询将返回数组arr
包含至少一个字段field1
且值为value1
或value11
的子文档的所有文档。
修改强>
关于您的编辑,您不能以这种方式使用$ in运算符。
$ in运算符选择字段值的文档 等于指定数组中的任何值。
如果你在$ in查询中发送一个对象数组,它将匹配指定字段包含该对象的文档:
db.coll.find({ a: { $in : [ { b : 1, c: 1}, { b : 2, c: 2} ]}});
会找到这个文件:
{
_id : ...
a: { b : 1, c: 1}
}
{
_id : ...
a: { b : 2, c: 2}
}
要获得您真正想要的内容,最简单的查询方法是从对象数组中提取值,并使用创建的值数组进行查询。