MongoDB查找特定元素和排序

时间:2014-12-29 10:01:24

标签: mongodb sorting find

这是我在集合中的数据:

{ "installation" : 200278 , 
      "date" : [ 
           { "date" : "2014-12-28" , 
                "values" : [ 
                      { "time" : "2014-12-28 00:15:26" , "value" : 26}, 
                      { "time" : "2014-12-28 00:30:26" , "value" : 15} , 
                      { "time" : "2014-12-28 00:45:26" , "value" : 7} , 
                      { "time" : "2014-12-28 01:00:26" , "value" : 32}
                ]
           }, 
           { "date" : "2014-12-29" , 
                "values" : [ 
                      { "time" : "2014-12-29 00:15:26" , "value" : 26}, 
                      { "time" : "2014-12-29 00:30:26" , "value" : 15} , 
                      { "time" : "2014-12-29 00:45:26" , "value" : 7} , 
                      { "time" : "2014-12-29 01:00:26" , "value" : 32}
                ]
           }
     ]
}, 
{ "installation" : 200312
    ...

我试着查询一下:

db.measure.find({"installation" : 200278 , "date.date" : "2014-12-28"}, 
                {"date.date" : 1 , "_id" : 0})
                .sort({"date.date" : 1})

首先,我不明白为什么" date.date"不只是返回元素" 2014-12-28"。 另外,也许我的排序错了,但无论我在1号上的标志是否仍然返回相同的顺序。

结果:

{ "date" : [ { "date" : "2014-12-28" }, { "date" : "2014-12-29" } ] }

澄清

我希望我的查询返回的只是元素:

{" date" :" 2014-12-28" }

排序问题是我对Mongo api进行黑客攻击的延伸。并且想知道这个查询是如何工作的。

2 个答案:

答案 0 :(得分:2)

您需要汇总结果。

执行与sort()链接的find()时,排序适用于由find()查询过滤的根文档,而不适用于数组子文档。

为了对数组元素进行排序,您需要使用聚合管道,如下所示:

db.measure.aggregate([
{$match:{"installation" : 200278,"date.date" : "2014-12-28"}},
{$unwind:"$date"},
{$sort:{"date.date":-1}},
{$group:{"_id":"$id","installation":{$first:"$installation"},"date":{$push:"$date"}}},
{$project:{"_id" : 0,"installation":1,"date.date":1}}
])
  

首先,我不明白为什么" date.date"不仅会使用" 2014-12-28"。

返回元素

要仅获取与查询匹配的第一个数组元素,您需要使用$(位置运算符)。

db.measure.find({"installation" : 200278 , 
                 "date.date" : "2014-12-28"}, 
                 {"date.$" : 1,"_id":0})

如果您希望date数组始终按date排序,则可以确保在对数组进行更新时,使用$each和{{1}更新运营商。

$sort

因此,查找查询将始终返回每个安装的已排序日期文档数组。

答案 1 :(得分:0)

在我们自己的@BatScream

的帮助下,为完整性提供美化解决方案
db.measure.aggregate([ {$match:{ "installation" : 200278}}, 
                       {$unwind:"$date"}, 
                       {$match:{"date.date":"2014-12-28"}}, 
                       {$project:{"_id" : 0,"date.date":1, "date.values":1}} 
                    ])

结果:

{ date" : { "date" : "2014-12-28", "values" : [ 
             { "time" : "2014-12-28 00:15:26", "value" : 26 }, 
             { "time" : "2014-12-28 00:30:26", "value" : 15 }, 
             { "time" : "2014-12-28 00:45:26", "value" : 7 }, 
             { "time" : "2014-12-28 01:00:26", "value" : 32 } 
             ]
         } }