Mongodb $ in对数组对象的字段而不是数组的对象

时间:2014-07-01 05:56:58

标签: javascript mongodb mongoose mongodb-query aggregation-framework

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我提供查询。

3 个答案:

答案 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且值为value1value11的子文档的所有文档。

修改

关于您的编辑,您不能以这种方式使用$ in运算符。

来自documentation

  

$ 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} 
}

要获得您真正想要的内容,最简单的查询方法是从对象数组中提取值,并使用创建的值数组进行查询。