我认为没有比使用operator更好的选择了$where
,它允许您通过指定自定义 JavaScript 函数来过滤集合。
请注意,对于大型集合,这可能会导致性能问题,因为$where
条件无法利用索引。
好的,回到问题:在{ "array": { '0': 'a', '1' : 'b' } }
字面上,array
从技术上讲,它不是一个数组,而是一个具有 、 和 属性'0'
的'1'
对象'2'
。
假设所有array
对象都将具有从 开始的连续属性列表'0'
,您可以迭代直到找到匹配项或i
为array[i]
is的数字undefined
(表示连续属性序列的结束)。
实现这一点的 JavaScript 函数是:
function () {
for(var i = 0; this.array[i] !== undefined; i++) {
if(this.array[i] === 'b') {
return true;
}
}
return false;
}
为了轻松地将其粘贴到 Mongo shell 中,这里是单行版本:
function () {for(var i=0; this.array[i]!==undefined; i++) {if(this.array[i]==='b') {return true; } } return false; }
请注意有关上述脚本的两件事:
this.array
如果属性的名称不同于"array"
'b'
是要在"array"中搜索的值。将其更改为您要搜索的任何内容。
因此,使用上面的脚本,这就是您可以在 Mongo shell 中编写的内容:
db.arraycollection.find({$where: function() {for(var i=0; this.array[i]!==undefined; i++) {if(this.array[i]==='b') {return true; } } return false; }});
为了简化一点,因为这是 的唯一条件find()
,我们可以完全省略$where
,只留下 js 函数作为参数:
db.arraycollection.find(function() {for(var i=0; this.array[i]!==undefined; i++) {if(this.array[i]==='b') {return true; } } return false; });
PS:很抱歉上面的长行让你滚动,但我认为单行更方便粘贴在 Mongo shell 中。