【问题标题】:MongoDB finding specific elements and sortingMongoDB查找特定元素并排序
【发布时间】:2015-02-25 12:18:10
【问题描述】:

这是我在集合中的数据:

{ "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" } ] }

澄清

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

{ "日期" : "2014-12-28" }

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

【问题讨论】:

  • 对于您想要排序的内容似乎有点模糊。您只是想要对数组进行排序,还是想要根据最新的数组结果对文档进行排序?这一点可以说得更清楚。
  • 我希望对数组日期中名为日期的元素进行排序。
  • 我认为@Disposer 实际上发布了一个解决方案来做到这一点。但是根据我的 cmets,有一种方法可以在插入数组元素并永久对元素进行排序时执行此操作。这就是为什么你被问到你真正想要做什么。
  • 平心而论,您的编辑仍然不是很清楚。您现在是否只想简单地返回那个“日期”元素。或者你想要它下面匹配的所有东西? @BatScream 现在编辑的响应仍然包含一些有效点。如果不完全清楚为什么。
  • 因为我习惯了 SQL 查询。我对 mongo 需要解释一切的方式不熟悉。从安装 = 200278 和 date.date = 2014-12-18 的度量中选择 date.date 将返回日期而不是其他任何内容。

标签: mongodb sorting find


【解决方案1】:

您需要汇总结果。

当您执行与find() 链接的sort() 时,排序适用于由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$sort 更新运算符。

db.measures.update({"installation":200278},
            {$push:{
                    date:{
                          $each:[{date object},
                                 {date object},...],
                          $sort:{"date":-1}, // sort the date array by `date` 
                                             // field during updates
                         }
            }}) 

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

【讨论】:

  • .aggregate() 的方法很好。但是新用户可能会对他们的实际问题有更好的说明。如上。 +1 的努力,但我不确定这是否解决了真正的问题。
  • 实际上我正在回答为什么代码不能像 OP 期望的那样工作。
  • 实际上,OP 没有做出任何回应,也没有进一步解释他们在做什么,或者数组帖子“记录”的聚合和排序是否是正确的方法。因此是评论,因此是“您本来可以问的”,因此是将军。这不是“攻击”,只是在总体目标似乎含糊不清时需要考虑的事情(恕我直言)。
  • 是的,尼尔很好,我明白。应该在发布之前要求澄清。下次会这样做。我只是假设在这种情况下 OP 试图问什么。
  • @miniwolf - 很好。您需要研究聚合解决方案来解决涉及子文档的问题。无论你学习什么,开始总是有点困难。
【解决方案2】:

在我们自己的@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 } 
             ]
         } }

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多