首页 > 解决方案 > 如何在MongoDB中聚合不同的数组字段

问题描述

我有这个架构

const GroupSchema = new Schema({
  id: { type: String },
  users: [{ type: Number }],
  status: { type: Boolean }
},
  {
    timestamps: true
  });

我尝试聚合按创建日期排序的不同用户值。例子

 {
    "users": [1111, 2222],
    "createdAt": {
        "$date": "2020-09-30T10:51:33.058Z"
    }
}
    {
        "users": [1111, 2222],
        "createdAt": {
            "$date": "2020-09-29T10:51:33.058Z"
        }
    }

我尝试:

Group.aggregate([
        { "$sort": { "createdAt": -1 } },
        { $group : { _id : "$users" }}, //, created : { $last : "created" }
        { $match : { users : {$in : [1111] }  }}
    ])

我预计

 {
"users": [1111, 2222],
"createdAt": {
    "$date": "2020-09-30T10:51:33.058Z"
}
}

我该如何解决?谢谢。

标签: node.jsdatabasemongodbmongoosenosql

解决方案


你可以试试,

  • $match你的情况
  • $sort由 createdAt 日期
  • $group通过 users 数组并获取 latestDoc 中的最新文档
  • $replaceWith替换 root 中的 latestDoc
db.collection.aggregate([
  { $match: { users: { $in: [1111] } } },
  { $sort: { createdAt: -1 } },
  {
    $group: {
      _id: "$users",
      latestDoc: { $first: "$$ROOT" }
    }
  },
  { $replaceWith: "$latestDoc" }
])

操场


推荐阅读