1

我有一个文档集合,每个文档如下所示:

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

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

我想匹配数组been中所有元素的字段为真的文档。查看文档看起来我应该以某种方式使用$and但我不确定它是否适用于子字段。locations

4

2 回答 2

2

有几种选择:

  • 使用 $ne:db.destinations.find({"locations.been":{$ne:false}})
  • 在保存文档之前更改您的业务逻辑以预先计算该值。否则,此搜索必须查看所有记录,然后查看所有地点。这个值可以被索引。
  • 使用 $where 运算符,但要了解性能影响。它可能需要全表扫描。在这种情况下,它会。
  • 使用过滤器逻辑编写一个map-reduce函数,并且只发出那些有效的函数。您需要根据文档逐步更新它。
  • 使用聚合框架编写查询。这里有很多很好的例子。尽管与其他解决方案一样,这最终可能会遍历整个集合。
于 2013-02-10T12:53:55.500 回答
0

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

db.test.find("return this.locations.every(function(loc){return loc.been});")
于 2013-02-10T11:59:29.523 回答