我有两个系列

  • 用于保存以下用户的集合
  • 用户故事集

我只想看到我关注的用户的故事

这是我的数据库示例

db = {
  "follow": [
    {
      "_id": 1,
      "start": "user1",
      "end": "user2",
      
    },
    {
      "_id": 2,
      "start": "user2",
      "end": "user3",
      
    }
  ],
  "story": [
    {
      "_id": 1,
      "owner_id": "user2",
      "updated_at": 1638090000,
      "deleted_at": null
    },
    {
      "_id": 2,
      "owner_id": "user3",
      "updated_at": 1638080000,
      "deleted_at": null
    }
  ]
}

我想要这样一个问题.当然,这是错误的:

db.story.aggregate([
  {
    "$match": {
      "deleted_at": null,
      "updated_at": {
        $gte: 1638081000
      },
      "owner_id": {
        $in: [
          db.follow.find({"start": "user1"})
        ]
      }
    }
  }
])

Note that I want all of this to be done in one query

mongoplayground 查询:https://mongoplayground.net/p/ysRUDW4hRzh

推荐答案

您应该在此处使用$lookup

db.follow.aggregate([
  {
    "$match": {
      "start": "user2"
    }
  },
  {
    $lookup: {
      from: "story",
      localField: "end",
      foreignField: "owner_id",
      pipeline: [],
      as: "stories",
    }
  },
  
])

该查询查找故事数据库,其中localField(本例中为end)等于foreignField(本例中为owner\u id),然后放在故事字段上

结果:

Database相关问答推荐

获取总和列的比率

时间数据库设计,有一个转折(live vs draft rows)

repeating groups是什么意思?

数据库中空值(nulls)使用的空间

Android - SQLite 数据库存储在哪里?

跨不同数据库创建视图

如何在 SQL Server 中生成随机数据?

我可以为 dapper-dot-net 映射指定数据库列名称吗?

prices价格字段是浮动还是小数好点?

mysql,dump,数据库restore恢复

有没有办法在一个脚本中创建多个触发器?

每个 Docker 容器一个或多个数据库

用于 Java 桌面应用程序的最佳数据库是什么

在服务器上排序还是在客户端排序?

表模块与域模型

如何在我的 SQL Server 代理作业(job)中创建一个将运行我的 SSIS 包的步骤?

游戏中使用什么样的数据库?

计算邮政编码...和用户之间的距离.

做或不做:将图像存储在数据库中

数据库事务是否防止竞争条件?