Arrays 如何在子文档的每个字段中进行搜索

Arrays 如何在子文档的每个字段中进行搜索,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,这是我的文件: { "_id" : ObjectId("5259b73b4949e0b22608960d"), "array" : [ "a", "b" ] } 要在数组字段中查找一些值,我使用以下查询: db.collection.find({roles: 'a'}) 但是当数组字段如下所示时,我遇到了这个问题: { "array": { '0': 'a', '1' : 'b' } } 如何使用这种数组(实际上是一个子文档,其中所有字段都是数组索引)执行与以前相同的查询? 所以我需要

这是我的文件:

{ "_id" : ObjectId("5259b73b4949e0b22608960d"), "array" : [  "a",  "b" ] }
要在
数组
字段中查找一些值,我使用以下查询:

db.collection.find({roles: 'a'})
但是当
数组
字段如下所示时,我遇到了这个问题:

{ "array": { '0': 'a', '1' : 'b' } }
如何使用这种数组(实际上是一个子文档,其中所有字段都是数组索引)执行与以前相同的查询? 所以我需要找到一个文档,其中任何子文档的字段都等于某物


很遗憾,我无法更改此字段,因为它是由第三方API生成的。

您可以使用以下方法查找数组的子文档:


这将从集合中找到具有特定对象id的“数组”,以及与{0:'1'}对象匹配的数组对象。

我看不出比使用更好的选择,它允许您通过指定自定义JavaScript函数来过滤集合

请注意,对于大型集合,这可能会造成性能问题,因为
$where
条件无法利用索引

好,回到问题:在
{“array”:{0':'a',1':'b'}
literal中,
array
从技术上讲不是数组,而是具有属性
'0'
'1'
'2'
的对象

假设所有
array
对象都有一个从
'0'
开始的连续属性列表,您可以迭代,直到找到一个匹配项,或者找到一个
array[i]
未定义的
(表示连续属性序列的结束)的编号
i

实现这一点的JavaScript函数是:

函数(){
for(var i=0;this.array[i]!==未定义;i++){
if(此.array[i]='b'){
返回true;
}
} 
返回false;
}
为了方便地将其粘贴到Mongo shell中,以下是单行版本:

function(){for(var i=0;this.array[i]!==未定义;i++{if(this.array[i]==='b'){return true;}}return false;}
请注意上述脚本的两个方面:

  • 如果属性的名称不同于
    “array”
  • 'b'
    是要在“数组”中搜索的值。将此更改为您要搜索的内容
因此,使用上面的脚本,您可以在Mongo shell中编写以下内容:

db.arraycollection.find({$where:function(){for(var i=0;this.array[i]!==未定义;i++){if(this.array[i]==='b'){return true;}}return false;}});
为了简化一些,因为这是
find()
的唯一条件,我们可以省略
$where
,只留下js函数作为参数:

db.arraycollection.find(函数(){for(var i=0;this.array[i]!==未定义;i++){if(this.array[i]==='b'){return true;}}}return false;});

PS:很抱歉上面的长行让您滚动,但我认为一行程序更方便粘贴到Mongo shell中。

这并不能回答问题。OP正在寻找一种方法来比较数组中的所有值,而不仅仅是第一个值。谢谢你的回答!我很快就会试试的。
db.collection.find( { "_id" : ObjectId("5259b73b4949e0b22608960d") },
             { array: { $elemMatch: { 0: '1'} } )