当前位置: 首页 > 知识库问答 >
问题:

更新字段中的MongoDb数据

黄高爽
2023-03-14

我有一个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个答案

鲍鸿波
2023-03-14

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

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} }
);
 类似资料:
  • 我已经搜索和尝试了许多答案,但我似乎无法让这个工作。我在MongoDB中有一个用户(db.users...)我试图在一个特定的文档中更新一个名为“角色”的字段。如果我执行: assert失败:需要对象错误:在printStackTrace(src/mongo/shell/utils.js:37:15)在doassert(src/mongo/shell/assert.js:6:5)在assert(s

  • 我是否可以在具有的数组中嵌入对象的数组的第二个元素? 结果:

  • 例如,我可以运行这个mongo查询: 我们如何用代码和spring MongoTemplate来实现这一点呢?例如,下面是UPDATE一个值的代码: Update#set方法似乎只接受一个(key、value),而不接受多值或值列表。

  • mongodb新手,尝试更新文档的多个数组对象字段。没有得到预期的结果 文档结构: 基于id需要更新日期 Spring启动代码 但是当我运行这个查询时,它返回null。有人能帮我吗?谢谢,我也试过了

  • 我正在使用Spring-Boot 2.5.0和MongoDB来持久化一些文档。这里是Github项目。 对于每个文档,我还需要自动保存一些审计信息,因此我扩展了以下类: 例如。让我们考虑类: 我遇到的问题是,当我通过JSON更新文档时,我能够更改/覆盖CreatedBy和CreatedDate字段的值。 这意味着,如果未提供字段,则结果值将保存为null,否则,它将为创建者和创建的字段保存新值。

  • 我正在尝试使用Spring Data mongodb更新mongodb中嵌入文档中的数组字段。 我想在mongodb集合中更新/插入的文档结构如下所示。 可以有更多这样的文档基于每个类型的部门,如“销售”,“市场营销”等。 即使这样做有效,我也不确定在Spring Data MongoDB中实现相同的功能是否有类似的支持。 另外,我的另一个查询是,如果我想为多个部门添加/更新员工,比如“Accou