MongoDB -通过对象属性值减少对象数组

r1zhe5dt  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(136)

我试图找到一种方法来删除除最新文档之外的所有重复文档。

[
    {
      id: 123,
      value: "ABC",
      date: "yesterday"
    },
    {
      id: 456,
      value: "DEF",
      date: "today"
    },
    {
      id: 123,
      value: "XYZ",
      date: "today"
    },
]

我的预期输出是-

[
    {
      id: 456,
      value: "DEF",
      date: "today"
    },
    {
      id: 123,
      value: "XYZ",
      date: "today"
    },
]

我认为解决问题的方法-

db.collectionName.aggregate([
{
  $sort: { date: -1 }
},
{
$reduce: {
  input: "CURRENT_ARRAY",
  initialValue: [],
  in: {
    $cond: [
      { "CONDITION_TO_CHECK_id_MATCHED" }
    ]
  }
}
])

但我不能设计它应该实现的代码。

gk7wooem

gk7wooem1#

你需要通过idid取“最后一个”文档,下面是一个快速的例子:

db.collection.aggregate([
  {
    $group: {
      _id: "$id",
      last: {
        $last: "$$ROOT"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$last"
    }
  }
])

Mongo Playground
这种方法的问题在于,我们依赖于“自然”顺序来匹配最新日期,这可能适用于您的应用程序,但如果不是这样,则需要在某个字段上的组阶段之前添加一个$sort阶段,以确保顺序正确(如果“date”字段实际上包含日期,则它是一个很好的候选字段)。如果您使用的是Mongo 5.2以上版本,则可以使用bottom操作符来代替排序阶段。

相关问题