【问题标题】:MongoDB query using Mongoose使用 Mongoose 进行 MongoDB 查询
【发布时间】:2022-01-06 19:04:34
【问题描述】:

我有一个照片集,其中存储了用户、标签、日期和照片网址。我希望查询为每个标签的用户返回 2 张最新照片。

例如

{user: 1, date: 1, url: a, tag: tag1}
{user: 1, date: 2, url: b, tag: tag1}
{user: 1, date: 3, url: c, tag: tag1}
{user: 1, date: 4, url: d, tag: tag2}
{user: 2, date: 1, url: e, tag: tag1}
{user: 3, date: 1, url: f, tag: tag1}

对用户 1 运行查询应该返回

{user: 1, date: 1, url: a, tag: tag1}
{user: 1, date: 2, url: b, tag: tag1}
{user: 1, date: 4, url: d, tag: tag2}

我在 NodeJs 中使用猫鼬。

【问题讨论】:

  • 您是否查看过docs 并尝试进行此查询?请更新您的问题,以便我们帮助调试

标签: node.js mongodb mongoose


【解决方案1】:

查询

  • 在 MongoDB 5 中,更简单的方法是使用 $setWindowFields
  • 匹配用户
  • 按标签(分区)分组,按日期排序,排名(添加一个字段,其组内每个文档的顺序)
  • 只保留排名
  • 取消设置以移除排名

*这给出了最旧的,因为在您的预期输出中您有最旧的,您可以使用 {"date":-1} 将其更改为最新的

*MongoDB

Test code here

aggregate(
[{"$match":{"$user" : 1}},
 {"$setWindowFields":
  {"partitionBy":"$tag",
   "sortBy":{"date":1},
   "output":{"rank":{"$rank":{}}}}},
 {"$match":{"$expr":{"$lt":["$rank", 3]}}},
 {"$unset":["rank"]}])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2015-03-13
    • 2016-05-30
    • 2014-10-10
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多