我有一个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);
});
您可以使用$[
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} }
);