你可以在Mongo中匹配$ all的子字段吗?

时间:2013-02-10 11:27:14

标签: mongodb pymongo mongodb-query

我有一个文档集合,其中每个文档都是这样的:

{'name' : 'John', 'locations' : 
   [
     {'place' : 'Paris',  'been' : true}
     {'place' : 'Moscow', 'been' : false}
     {'place' : 'Berlin', 'been' : true}
   ]
}

位置数组可以有任何长度。

我希望匹配been数组中所有元素的locations字段为true的文档。 Looking at the documentation看起来我应该以某种方式使用$and,但我不确定它是否适用于子字段。

2 个答案:

答案 0 :(得分:2)

有几种选择:

  • 使用$ ne:db.destinations.find({"locations.been":{$ne:false}})
  • 在保存文档之前更改业务逻辑以预先计算该值。否则,此搜索必须查看所有记录,然后查看所有位置。该值可以编入索引。
  • 使用$ where运算符,但是,了解performance含义。它可能需要全表扫描。在这种情况下,它会。
  • 使用过滤器逻辑编写map-reduce函数,并仅发出有效的函数。您需要按文档逐步更新它。
  • 使用aggregation框架编写查询。有很多很好的例子here。虽然像其他解决方案一样,这可能最终会在整个集合中循环。

答案 1 :(得分:0)

我认为使用$elemMatch$all这样的标准MongoDB运算符是不可能的。唯一可行的方法是编写自定义JS查询:

db.test.find("return this.locations.every(function(loc){return loc.been});")