我的MongoDB数据库中有两个集合,categoryproduct,这两者之间有一对多的关系.所以我得到了我想要的:

db.category.aggregate([
  {
    "$lookup": {
      "from": "product",
      "localField": "_id",
      "foreignField": "category_id",
      "as": "products"
    }
  }
])

它工作得非常好,现在我想向乘积数组中的每个乘积添加一个等于_id的新字段id.经过数小时的研究,这是我能找到的最接近的东西:

db.category.aggregate([
  {
    "$lookup": {
      "from": "product",
      "localField": "_id",
      "foreignField": "category_id",
      "as": "products"
    }
  },
  {
    $addFields: {
      "id": "$_id",
      "product.id": "$products._id"
    }
  },
  
])

这将添加id个字段,但其值等于包含所有乘积_id的数组!

我在Mongoplayground 创建了这个,以防你想查看:

非常感谢您的帮助.

推荐答案

您需要使用完整的$lookup语法并在子查询中添加字段:

db.category.aggregate([
  {
    "$lookup": {
      "from": "product",
      "let": {
        "id": "$_id"
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              "$eq": [
                "$category_id",
                "$$id"
              ]
            }
          }
        },
        {
          "$addFields": {
            "id": "$_id"
          }
        }
      ],
      "as": "products"
    }
  },
  
])

Mongodb相关问答推荐

如何限制/筛选子文档中的条目?

如何在MongoDB中正确解析佛年?

会话的Mongo-go驱动程序版本.Copy()

MongoDB:就地分组嵌套数组的元素

MongoDB v4.4聚合的$getfield替代方案

最有效的Mongo聚合来展开和过滤:匹配、展开、匹配与投影和过滤

如何用Python和MongoDB找到单据字段的最大值?

将子文档中的所有字段设置为 false,然后在单个查询中将第二个字段设置为 true

删除一对一和一对多引用 - Mongoose

从 PHP 打印 MongoDB 日期

MongoDB 的 BinData(0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M=") 中的0是什么意思?

在 Mongoose 中清理用户输入

MongoDB 1.6.5:如何重命名集合中的字段

mongodb无法启动

MongoDB Java API:put() 与 append()

Mongodb:为什么 show dbs 不显示我的数据库?

用于嵌入式集合的 MongoDB 首选模式.文档与数组

如何从 Mongoose 模型对象中获取集合名称

MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

Mongodb Compass 无法在 Ubuntu 18.10 中打开