为什么Array.some不能在Mongo的$ where子句中工作?

时间:2011-09-14 11:56:39

标签: javascript arrays mongodb

我正在使用MongoDB 1.8.1。我想在$elemMatch子句中使用JavaScript数组上的标准$where方法模拟Mongo的some查询。但是,即使我提供了虚函数,查询也永远不会匹配任何内容。

> db.foo.insert({bar: [1, 2, 3]})
> db.foo.count({$where: 'this.bar && (this.bar.length > 0)'})
1
> db.foo.count({$where: 'this.bar && this.bar.some'})
1
> db.foo.count({$where: 'this.bar && this.bar.some(function() {return true;})'})
0

在MongoDB shell中,它可以工作:

> [1, 2, 3].some(function() {return true;})
true

为什么会这样?

1 个答案:

答案 0 :(得分:2)

只需在您的查询位置之前添加return

> db.foo.count({$where: 'return this.bar && this.bar.some(function() {return true;})'})
> 1
> db.foo.count({$where: 'return this.bar && this.bar.some(function(bar) {return bar>2;})'})
> 1
> db.foo.count({$where: 'return this.bar.some(function(bar) {return bar==1;}) &&  this.bar.some(function(bar) {return bar==6;})'})
> 0

但我更喜欢在claues中使用函数而不是字符串,那更干净

>db.foo.count({$where: function() { return  this.bar.some(function(bar) { return bar > 1;}) & this.bar.some(function(bar) { return bar > 2;}) }})
 >1