我认为没有比使用the $where operator 更好的选择了,它允许您通过指定自定义 JavaScript 函数来过滤集合。
请注意,对于大型集合,这可能会造成性能问题,因为$where 条件无法利用索引。
好的,回到问题:在{ "array": { '0': 'a', '1' : 'b' } } 字面量中,array 在技术上并不是一个数组,而是一个具有'0'、'1' 和'2' 属性的对象。
假设所有array 对象将具有从'0' 开始的连续属性列表,您可以迭代直到找到匹配项或i 的数字array[i] 是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; }
请注意上面脚本的两点:
-
如果属性的名称不同于
"array",则应更改this.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 中。