提问者:小点点

更新字段中的MongoDb数据


我有一个MongoDb数据库,其中包含一个名为rooms的集合。在rooms中,我希望通过roomid属性搜索特定对象。我想更新找到的对象中的数组内容。例如,最初,在向该endpoint发出请求之前,所需的数据如下所示:

{
    available: true,
    _id: 60817a403170bf49185c7db7,
    player1: "Jack",
    player2: "Adam",
    roomId: "ABCDE",
    pieces: [
        {
            point: [6, 0],
            player: "1",
            type: "P"
        },
        ...
    ],
    __v: 0
}

发出类似http://localhost:8000/room/abcde?x1=6&y1=0&x2=4&y2=0的请求后,mongodb中的数据应更新为

{
    available: true,
    _id: 60817a403170bf49185c7db7,
    player1: "Jack",
    player2: "Adam",
    roomId: "ABCDE",
    pieces: [
        {
            point: [4, 0], /* DATA UPDATED */
            player: "1",
            type: "P"
        },
        ...
    ],
    __v: 0
}

这是我的api.js文件,为了执行它,注释中的代码应该是什么?

const express = require('express');
const GameRoom = require('../models/room');
const router = express.Router();

router.put('/room/:id', (req, res, next) => {
    GameRoom.findOne({roomId: req.params.id})
        .then(data => {
            const pieces = data.pieces;
            for (let i = 0; i < pieces.length; i++) {
                if (pieces[i].point[0] === parseInt(req.query.x1) &&
                        pieces[i].point[1] === parseInt(req.query.y1)) {
                    pieces[i].point = [req.query.x2, req.query.y2];
                    break;
                }
            }         
            // Take the modified pieces array and update it
        }).catch(next);
});

共1个答案

匿名用户

您可以使用$[]查找和更新点数:

GameRoom.updateOne(
  { roomId: req.params.id },
  { $set: { "pieces.$[el].point.0": req.query.x2, "pieces.$[el].point.1": req.query.y2 }}, 
  { arrayFilters: [ { "el.point.0": req.query.x1, "el.point.1": req.query.y1 } ]}
);

或者,如果您只想更新与条件匹配的第一部分,那么您可以使用$elemmatch和$operator:

GameRoom.updateOne(
  { 
    roomId: req.params.id, 
    pieces: {$elemMatch: {"point.0": req.query.x1, "point.1": req.query.y1}}} 
  },
  { $set: {"pieces.$.point.0": req.query.x2, "pieces.$.point.1": req.query.y2} }
);