mongodb 在这种情况下,使用nosql的最佳方法是什么?

zazmityj  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(355)

我想在mongodb中按用户查找最新的数据。
假设数据如下所示:

{
 _id: "1",
 user_id: "userA",
 date: "2022-10-20 11:00:00.000000000"
},
{
 _id: "2",
 user_id: "userA",
 date: "2022-10-25 18:00:00.000000000"
},
{
 _id: "3",
 user_id: "userB",
 date: "2022-10-25 18:00:00.000000000"
},
{
 _id: "4",
 user_id: "userC",
 date: "2022-10-25 18:00:00.000000000"
}

所以我希望找到这样的结果:

{
 _id: "2",
 user_id: "userA",
 date: "2022-10-25 18:00:00.000000000"
},
{
 _id: "3",
 user_id: "userB",
 date: "2022-10-25 18:00:00.000000000"
},
{
 _id: "4",
 user_id: "userC",
 date: "2022-10-25 18:00:00.000000000"
}

最好的办法是什么?

yhuiod9q

yhuiod9q1#

如果你使用的是Mongo 5.2以上版本,那么你可以使用$group和新的$bottom运算符,如下所示:

db.collection.aggregate([
  {
    $group: {
      _id: "$user_id",
      root: {
        "$bottom": {
          "sortBy": {
            "date": 1
          },
          "output": "$$ROOT"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$root"
    }
  }
])

MongoPlayground
否则,没有真实的好的方法来实现这一点,您将不得不按date对整个集合进行排序(假设所有日期都以正确的格式保存),然后按用户id分组并获取“最新”示例。

db.collection.aggregate([
  {
    $sort: {
      date: -1
    }
  },
  {
    $group: {
      _id: "$user_id",
      root: {
        $first: "$$ROOT"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$root"
    }
  }
])

Mongo Playground

相关问题