Запрос MongoDB для объектов в массиве на основе условия

У меня есть инвентарь игроков, который выглядит следующим образом.

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 Wood и 2 Stone запрос должен вернуть все 3 таблицы крафта, так как у игрока достаточно ресурсов для создания всех трех.

Это то, что я имею до сих пор, и я очень потерян. Пожалуйста помоги!

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

Вот вещь. Инвентарь игроков может меняться на бесконечное количество различных ресурсов. И у созданных предметов может быть бесконечное количество различных требований. Я просто привел пример того, как могут выглядеть инвентарь и предметы, которые можно изготовить.

Как вы перечисляете документы, чтобы у игрока было достаточно ресурсов для создания?

Всего 1 ответ


Попробуй это :

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

Есть идеи?

10000