MongoDB根据条件对数组中的对象进行查询

时间:2020-01-14 06:06:09

标签: mongodb mongoose

我有一个类似这样的球员盘点。

let inventory = [ { name: 'Wood', amount: 6 }, { name: 'Stone', amount: 2 } ]

这是玩家资源。

我还有一个手工制作的物品清单。

{"name":"CraftingTable","craftingReagents":[{"name":"Stone","amount":"2"}]}
{"name":"CraftingTable2","craftingReagents":[{"name":"Wood","amount":"4"}]}
{"name":"CraftingTable3","craftingReagents":[{"name":"Wood","amount":"5"},{"name":"Stone","amount":"2"}]}

项目架构就是这样

let itemSchema = new mongoose.Schema(
    {
        name:String,
        craftingReagents: [
            {
                name: String,
                amount: Number
            }
        ]

    }
);

我想要一个查询,该查询将返回玩家库存具有足够资源的所有可制作对象。

例如,对于6个木材和2个石头,该查询应返回所有3个制作表,因为玩家有足够的资源来制作这3个制作表

这是我到目前为止所拥有的,我非常迷失。请帮忙!

itemModel.find({
     craftingReagents: {
          $all: [{
               $elemMatch: {
                    name: {
                         $in: [
                              'Wood'
                         ]
                    },
                    amount: { $lte: 6 }
                    }
               },
               {
               $elemMatch: {
                    name: {
                         $in: [
                              'Stone'
                              ]
                         },
                    amount: { $lte: 2 }
               }
          }
     ]
}
});

这里有东西。玩家清单可以更改为无限数量的不同资源。并且可制作对象可以具有无限数量的不同要求。我仅举一个示例,说明库存和可加工对象的外观。

您如何列出播放器有足够资源来制作的文件?

1 个答案:

答案 0 :(得分:0)

尝试一下:

itemModel.find({
    $or: [{ craftingReagents: { $elemMatch: { name: 'Wood', amount: { $lte: 6 } } } },
    { craftingReagents: { $elemMatch: { name: 'Stone', amount: { $lte: 2 } } } }]
})