簡體   English   中英

Mongo聚合查找數組字段和匹配

[英]Mongo aggregate lookup array field and match

使用 mongo 聚合,如何從父文檔的數組中查找子文檔並將子文檔的字段與值匹配?

我想查找ShopItemShop 而且我只想ShopItemkidFriendly

細節:

假設我有Shops

Shop模式

{
shopItems: [   
      {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'ShopItem',
      },
    ],
}

一個商店可以有多個商店物品:

ShopItem架構

[
itemName:  { type: String },
kidFriendly:  { type: Boolean, default: false },
]

我想查找ShopItemShop 而且我只想ShopItemkidFriendly

我試過了

      const result3 = await Shop.aggregate([
        {
          $match: {
            _id: mongoose.Types.ObjectId('623ae52ba5b1af0004e1c4ec'),
          },
        },
        {
          $lookup: {
            from: ShopItem.collection.collectionName,
            pipeline: [
              {
                $match: {
                  kidFriendly: { $ne: true },
                  _id: { $in: '$shopItems' },
                },
              },
            ],
            as: 'adultOnlyItems',
          },
        },
      ]);

但我得到$in needs an array

示例數據

// shops
[
{
_id: ObjectId('623ae52ba5b1af0004e1c4ec'),
shopItems: [ObjectId('631e6b133b688a0004a17265'), ObjectId('62f4cc974a255f00044c01b5'), ObjectId('625ffc48eec7b20004c9294c')]
},
{
_id: ObjectId('623ae52ba5b1af0004e1c4eb'),
shopItems: [ObjectId('631e6b133b688a0004a17263')]
}
]

//shop items
[
{
_id: ObjectId('631e6b133b688a0004a17265'),
itemName: "Barbie",
kidFriendly: true
},
{
_id: ObjectId('62f4cc974a255f00044c01b5'),
itemName: "Alcohol",
kidFriendly: false
},
{
_id: ObjectId('625ffc48eec7b20004c9294c'),
itemName: "Glass Vase",
kidFriendly: false
},
{
_id: ObjectId('631e6b133b688a0004a17263'),
itemName: "Beach Ball",
kidFriendly: true
}

]

當您將$lookup與管道一起使用時,您需要let將來自shops的字段值存儲到變量中。 並使用$expr運算符。

db.shops.aggregate([
  {
    $match: {
      _id: mongoose.Types.ObjectId('623ae52ba5b1af0004e1c4ec')
    }
  },
  {
    $lookup: {
      from: ShopItem.collection.collectionName,
      let: {
        shopItems: "$shopItems"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $ne: [
                    "$kidFriendly",
                    true
                  ]
                },
                {
                  $in: [
                    "$_id",
                    "$$shopItems"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "adultOnlyItems"
    }
  }
])

演示@Mongo Playground


參考

連接集合上的連接條件和子查詢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM