Mongodb查找比较数组元素

Mongodb查找比较数组元素,mongodb,Mongodb,我收集了大约20万份文档,如下所示: db.place.find()[0] { "_id" : ObjectId("5290de1111afb260363aa4a1"), "name" : "place X", "center" : [x, y] } 现在,我试图查询中心Y大于X的位置,出现以下问题: > db.place.find({'center.0':{

我收集了大约20万份文档,如下所示:

db.place.find()[0]
{
    "_id" : ObjectId("5290de1111afb260363aa4a1"),
    "name" : "place X",
    "center" : [x, y]   
}
现在,我试图查询中心Y大于X的位置,出现以下问题:

> db.place.find({'center.0':{'$gt':center.1}}).count()
Sat Nov 23 14:42:01.556 JavaScript execution failed: SyntaxError: Unexpected number
有什么提示吗?
提前感谢

您似乎需要使用运算符

db.place.find({$where: function() {return this.center[0] > this.center[1]}})
例如,集合中有3个文档:

{ "_id" : ObjectId("52910457c7d99f10949e5a85"), "name" : "place X", "center" : [ 2,  3 ] }
{ "_id" : ObjectId("52910463c7d99f10949e5a86"), "name" : "place Y", "center" : [ 3,  2 ] }
{ "_id" : ObjectId("5291046ac7d99f10949e5a87"), "name" : "place Y", "center" : [ 8,  9 ] }
$where命令的结果将是:

{ "_id" : ObjectId("52910463c7d99f10949e5a86"), "name" : "place Y", "center" : [ 3,  2 ] }

您无法在mongo中以简单的方式执行所需的查询,因为mongo不支持基于集合中的元素进行搜索或更新。因此,即使是像
{a:1,b:1}
这样的简单文档,如果没有
$where
子句,也不可能找到a=b的文档

idbentley
db.place.find({'center.0':{'gt':'center.1'}})建议的解决方案将不起作用(也不会生成错误),因为这样您将比较center.0和字符串'center.1'。因此,正确的解决方案是Victoria Malaya的解决方案(但她最后忘了放.count()


我想建议一件事。任何带where的东西都非常慢。所以,如果您打算多次执行此查询,请考虑创建其他字段来存储此预计算结果(您可以用与answer类似的方式执行此操作)

因为您每次都有精确的字段格式(圆圈是两个元素的数组),所以您可以在聚合框架中将其转换为两个字段,然后在投影中比较它们,并进行匹配以仅返回满足您的要求的元素,即第二个数组元素大于第一个数组元素

db.place.aggregate( [
      { $unwind : "$center" },
      { $group : { _id : "$_id", 
                   centerX : {$first:"$center"}, 
                   centerY : {$last:"$center"} 
      } },
      { $project : { YgtX : { $gt : [ "$centerY", "$centerX" ] } } },
      { $match : { YgtX : true } }
] );
现在,如果数组是任意一对数值,那么可以使用上面的公式

您在评论中说,您的坐标对表示坐标(lat,long)-请记住,在MongoDB坐标对中,始终是-如果您的实际x,y值是平面(而不是球面)上的坐标,您可以通过单个地理空间查询找到y坐标大于x坐标的所有文档:

db.place.find( { center : { $geoWithin : { $geometry : {
                  type:"Polygon", 
                  coordinates:[[[50,50],[-50,50],[-50,-50],[50,50]]]
} } } } );

上述查询假设坐标系沿X和Y从-50变为50,并在三角形中找到表示Y>=X的所有坐标的所有点。

您也可以使用
$expr
操作符:

但是:与
$类似,其中
$expr
非常慢,请阅读此处了解详细信息:


这里的示例:

应该是:
db.place.find({'center.0':{'gt':'center.1'}).count()
注意center周围的引号。1我尝试过这个查询,但似乎不起作用。我使用的是2.4.7版。我用$where运算符替换了答案。您不能引用where右侧的文档内容(即{a:1}可以,{a:b}如果你需要比较X和Y,你可能会认为模式对于你的用例来说不是最好的。你必须像这样存储X和Y吗?可能有一种方法可以在不使用$WORE的情况下做到这一点。“中心”总是一个有两个元素的数组,或者它可能有更多或更少的元素?和“y”-它们是数字吗?嘿,大家好,谢谢你们的回答…事实上,{'$gt':'center.1'}的解决方案返回0,因为它比较float和string..你好,维多利亚,谢谢你们的回答..正如萨尔瓦多·达利所说,这不是一个性能解决方案..将继续寻找更快的方法。
db.place.find({$expr: {$gt: ['$center.0', '$center.1']}}).count()