更新嵌套在另一个文档中的文档字段中的矩阵中的元素

时间:2020-06-04 02:23:22

标签: node.js mongodb matrix mongodb-query

真的很难很快提出我的问题,但这是矩阵在数据库中的位置 (矩阵可以具有任意数量的列/行,并且可以有多个花园):

{
  UserId: 5,
  Gardens : [
  {
    Name: "gardenName",
    Plants : [[Array][Array]]
    }
  ]
}

矩阵中的对象如下: {field1:val1,field2:val2,...}

如何使用nodejs / mongodb更新Plants矩阵中的元素的field1? 我已经看到了类似问题的解决方案,但是它们都不包括这样的矩阵,仅包括使用运算符$,$ []等的数组。但是我在这里看不到这样做的方法。

1 个答案:

答案 0 :(得分:0)

好吧,我发现一种解决方案不需要两个集合(一个用于矩阵,另一个用于用户),而不仅仅是MongoDB,因为它取决于前端向其发送矩阵的先前版本。

它是这样的:

let user = req.session.user;

let name = req.body.name;
let gardenMat = req.body.garden;
let i = parseInt(req.body.x);
let j = parseInt(req.body.y);

gardenMat[i][j].state = newState;

db.collection('users').findOneAndUpdate(
    {username : user},
    {$set : {"garden.$[element].garden" : gardenMat}},
    {arrayFilters : [{"element.name" : {$eq : name}}]}
);

因此,前端发送正在显示的整个矩阵,这样我们就可以得到旧版本的矩阵。然后,我们更新某些字段(1个或更多),并简单地使用 findOneAndUpdate 来更新文档中的矩阵字段。

我认为具有两个集合的版本更简单,因为它不依赖于前端。