MongoDB: условное обновление одним запросом - PullRequest
0 голосов
/ 08 ноября 2019

Я использую MongoDB + Mongoose + Node.JS

Логика приложения: у нас есть игра, похожая на тральщик. Ячейки, выбранные пользователем, хранятся в игровом поле в fields: Array, а местоположения бомб - в bombs: Array.

. Когда пользователь выполняет запрос на выбор ячейки в игре, сервер должен установить fields[cell] = 1 // 1 means cell is selected. Если бомба в ячейке bombs[cell] === 1 // 1 means bomb in cell, нам нужно сделать другое обновление, например fields[cell] = 1; winning = 0. Как реализовать это в одном запросе?

Я пытался сделать запрос, который изменяет только field[cell] = 1, но не меняет winning = 0, если внутри поля обнаружена бомба.



Код:

const selection = await db.Minesweeper.findOneAndUpdate({
    uid,
    winning: null,
}, {
    $set: { [`fields.${cell}`]: 1, },
    // I need to set winning = 0, if [bombs.${cell}] = 1
});

Схема игры:

const MinesweeperSchema = new mongoose.Schema({
    uid: { type: Number, required: true },
    bet: { type: Number, required: true },
    winning: { type: Number, default: null },
    fields: { type: Array, default: new Array(5*5).fill(0) },
    bombs: { type: Array, required: true },
},
{ timestamps: true });



Ну, опять же:

Мне нужна эта логика: если выбранная ячейка содержит бомбу, установите field[cell_index] = 1; winning = 0, но если ячейка неНе содержит бомбу, установите field[cell_index] = 1

1 Ответ

0 голосов
/ 08 ноября 2019

Если вы используете модель MVC и Mongoose, вы можете сделать это следующим образом:


const Model = require("model file goes here"); // Example: require("./models/fields")

async function updateField() {
  const field = ""; // This variable should be whatever info you wanna save on the `field` on the DB
  await Model.findOneAndUpdate({ field });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...