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'
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'} } )