需要从所有包含的集合中获取每个文档的一些信息

问题描述 投票:0回答:1

收藏馆:

{
    "_id": ObjectId('0001'),
    "fruit": "apple",
    "entries": [
        DBRef('room', ObjectId('1234')),
        DBRef('room', ObjectId('5678'))
    ]
}

收藏室:

{
    "_id": ObjectId('1234'),
    "some": "data"
}

我现在想要所有房间的正常输出(简单查找),但丰富了一个水果数组,其中包含包含房间的房屋的所有水果(数组,因为一个房间可能位于多个房屋中),例如:

[
    {
        "some": "data",
        "fruits": ["apple"]
    }
]

所以我尝试聚合房间,对房子进行查找,但由于我需要搜索数组,所以我无法使用正常的查找,而是使用管道查找。在管道中,我需要创建一些匹配,但在其中(使用映射)我无法从 DBRef 中获取该死的 ObjectId。我知道,DBRef 显然已经过时了,但它是我们现在拥有的数据库,我需要使用。

有什么帮助吗? DB 版本为 4.0.22

mongodb
1个回答
0
投票

具有“实际”解决方案的游乐场: https://mongoplayground.net/p/HUm05wtOsMJ

数据:

db={
  "houses": [
    {
      "_id": 1001,
      "fruit": "apple",
      "dummy": "ignoreMe",
      "rooms": [
        {
          $ref: "rooms",
          $id: ObjectId("1bcdefbcdefbcdefbcdefbcd")
        },
        {
          $ref: "rooms",
          $id: ObjectId("2bcdefbcdefbcdefbcdefbcd")
        }
      ]
    },
    {
      "_id": 1002,
      "fruit": "pear",
      "dummy": "ignoreMe",
      "rooms": [
        {
          $ref: "rooms",
          $id: ObjectId("2bcdefbcdefbcdefbcdefbcd")
        },
        {
          $ref: "rooms",
          $id: ObjectId("3bcdefbcdefbcdefbcdefbcd")
        }
      ]
    }
  ],
  "rooms": [
    {
      "_id": ObjectId("1bcdefbcdefbcdefbcdefbcd"),
      "description": "room 1"
    },
    {
      "_id": ObjectId("2bcdefbcdefbcdefbcdefbcd"),
      "description": "room 2"
    },
    {
      "_id": ObjectId("3bcdefbcdefbcdefbcdefbcd"),
      "description": "room 3"
    }
  ]
}

查询:

db.rooms.aggregate([
  {
    "$lookup": {
      from: "houses",
      "let": {
        id: "$_id"
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $in: [
                "$$id",
                {
                  $map: {
                    "input": "$rooms",
                    "as": "room",
                    "in": "$$room.$id"
                  }
                }
              ]
            }
          }
        },
        {
          $project: {
            a: "$fruit"
          }
        }
      ],
      "as": "houseFruits"
    }
  }
])

但是,它在我的现实生活示例中不起作用,因为“聚合”不适用于“DBRef”...它告诉错误的是“fieldNames”可能不包含“$”...是的,谢谢没有什么。显然此时需要使用mapReduce。

我们需要重构这个数据库。

© www.soinside.com 2019 - 2024. All rights reserved.