【问题标题】:Retrieve documents which contain distinct element in array检索包含数组中不同元素的文档
【发布时间】:2017-03-01 12:06:43
【问题描述】:

我有类似的文件

[{"_id" : "12","name" : "test1", "nesArray" : [1,2], "createdAt" : ISODate("2016-10-15T06:17:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,3], "createdAt" :ISODate("2016-10-15T06:17:54.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,4], "createdAt" :ISODate("2016-10-15T06:17:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,2], "createdAt" :ISODate("2016-10-15T06:18:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,3], "createdAt" :ISODate("2016-10-15T06:18:53.946Z") },
{"_id" : "12","name" : "test1", "nesArray" : [1,2],"createdAt" :ISODate("2016-10-15T06:19:53.946Z") } ]

我只想检索那些有

的文档
  1. 不同的 nesArray
  2. 仅最新文档

结果应该是这样的

   [{"_id" : "12","name" : "test1", "nesArray" : [1,4], "createdAt" :ISODate("2016-10-15T06:17:53.946Z") },
    {"_id" : "12","name" : "test1", "nesArray" : [1,3], "createdAt" :ISODate("2016-10-15T06:18:53.946Z") },
    {"_id" : "12","name" : "test1", "nesArray" : [1,2],"createdAt" :ISODate("2016-10-15T06:19:53.946Z") }]

我尝试使用聚合,但我不想使用聚合(Mongoose 填充不适用于聚合)。

【问题讨论】:

  • 告诉我们您的尝试
  • @sidgate 我尝试了聚合 1. 按 createdAt 对元素进行排序 2. 按“nesArray”对文档进行分组 3. 按 $last 检索每个组的最新文档。

标签: mongodb mongoose


【解决方案1】:

这基本上是您尝试过的,但是使用 $last 获取所有字段并在之后投影以具有与 DB 中相同的结构:

db.coll.aggregate(
  { 
    $sort: { createdAt: 1 }
  }, 
  {
    $group: {
      _id: "$nesArray", 
      id: { $last: "$_id" }, 
      name: {$last: "$name"}, 
      createdAt: { $last: "$createdAt"}
    }
  },
  {
    $project: {
      _id: "$id",
      nesArray: "$_id",
      name: 1,
      createdAt: 1
    }
  }
)

【讨论】:

  • 我已经尝试过了,我需要帮助才能通过聚合获得它,以便我可以使用 populate(Mongoose)。
  • 它正在使用聚合。对聚合结果使用填充,Model.populate(results, ...)
  • 你能举个例子吗?
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多