typescript 从多个mongodb集合中查询数据

0x6upsns  于 2023-06-24  发布在  TypeScript
关注(0)|答案(1)|浏览(173)

你好,我有一个数据库,有这些以下集合的

db={
  "category": [
    {
      "_id": 1,
      "item": "Cat A",
    },
    {
      "_id": 2,
      "item": "Cat B",
    },
  ],
  "sticker": [
    {
      "_id": 1,
      "item": "Sticker 1",
    },
  ],
  "prefix": [
    {
      "_id": 1,
      "item": "prefix 1",
    },
  ],
  "store": [
    {
      "_id": 1,
      "item": "Item 1",
      "category_id": "1",
      "sticker_id": "1",
      "prefix_id": "1",
    },
    {
      "_id": 2,
      "item": "Item 2",
      "category_id": "2",
      "sticker_id": "1",
      "prefix_id": "1",
    },
    {
      "_id": 3,
      "item": "Item 3",
      "category_id": "1",
      "sticker_id": "1",
      "prefix_id": "1",
    },
  ],
}

我正在使用下面的查询从mongo集合中获取数据

await category.aggregate([
{
          $match: {
            _id: 1,
          }
        },
{
          $lookup: {
            "from": "store",
            let: { cid: "$_id" },
            pipeline: [
                {$match: {$expr: {$eq: [ "$category_id", "$$cid" ]} }},
            ],
            as: "stores"
          }
        }
])

通过这个查询,我得到了category、prefix和sticker的objectId作为响应,但我需要与objectId沿着的数据,如下所示

预期响应

[
  {
    "_id": 1,
    "item": "Cat A",
    "stores": [{
      "_id": 1,
      "item": "item 1",
      "stickerData": {
        "_id": 1,
        "item": "Sticker 1",
      },
      "prefixData": {
        "_id": 1,
        "item": "prefix 1",
      },
    },
    {
      "_id": 3,
      "item": "item 3",
       "stickerData": {
         "_id": 1,
         "item": "Sticker 1",
       },
       "prefixData": {
         "_id": 1,
         "item": "prefix 1",
       },
     },
   ],
  },
]

有没有人能提出一些适当的问题

m2xkgtsf

m2xkgtsf1#

$lookup stage中,您必须有多个$lookup stage,并通过管道连接 prefixsticker 集合。
请注意,storeprefixsticker 集合中的_id都是数字,而 store 集合中的store_idprefix_idsticker_id是字符串,请确保在连接时,两个id应作为相同类型进行比较。下面的查询示例将_id转换为字符串。

db.category.aggregate([
  {
    $match: {
      _id: 1,
      
    }
  },
  {
    $lookup: {
      "from": "store",
      let: {
        cid: {
          $toString: "$_id"
        }
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$category_id",
                "$$cid"
              ]
            }
          }
        },
        {
          $lookup: {
            from: "sticker",
            let: {
              sticker_id: "$sticker_id"
            },
            pipeline: [
              {
                $match: {
                  $expr: {
                    $eq: [
                      {
                        $toString: "$_id"
                      },
                      "$$sticker_id"
                    ]
                  }
                }
              }
            ],
            as: "stickerData"
          }
        },
        {
          $lookup: {
            from: "prefix",
            let: {
              prefix_id: "$prefix_id"
            },
            pipeline: [
              {
                $match: {
                  $expr: {
                    $eq: [
                      {
                        $toString: "$_id"
                      },
                      "$$prefix_id"
                    ]
                  }
                }
              }
            ],
            as: "prefixData"
          }
        },
        {
          $project: {
            _id: 1,
            item: 1,
            prefixData: {
              $first: "$prefixData"
            },
            stickerData: {
              $first: "$stickerData"
            }
          }
        }
      ],
      as: "stores"
    }
  }
])

Demo @ Mongo Playground

相关问题