Запрос MongoDB для объектов в массиве на основе условия - PullRequest
1 голос
/ 14 января 2020

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

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

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

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

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

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

1 Ответ

0 голосов
/ 14 января 2020

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

itemModel.find({
    $or: [{ craftingReagents: { $elemMatch: { name: 'Wood', amount: { $lte: 6 } } } },
    { craftingReagents: { $elemMatch: { name: 'Stone', amount: { $lte: 2 } } } }]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...