繁体   English   中英

如何在 mongodb 中涉及数组或其他类型的嵌入或嵌套文档的更新操作中使用变量?

[英]How can I use variables in an update operation in mongodb that involves an array or another type of embedded or nested document?

目标集合(“myCollection”)中的文档有一个名为“japanese2”的字段。 这是一个数组(或对象),其中包含一个 object,其中包含一个名为“japanese2a”的属性。 此属性的值最初设置为 0(尽管稍后可能会更改)。 我想用 node.js 中的脚本将此值更改为 100(我使用的是 Express 框架)。 数据库是Mongodb,免费云版叫Atlas。

如果我在不使用变量的情况下执行此操作,则效果很好:

db
 .collection("myCollection")
 .updateOne({username:username}, {"$set":{"japanese2.0.japanese2a":100}});

但是,如果我尝试使用字段名称“japanese2”和数组/对象中的元素/属性名称“japanese2a”的变量,它会失败。 我尝试了以下和其他变体,但找不到解决方案。 我已经研究了 stackoverflow 的答案,但找不到解决方案。

数组/对象中只有一个元素/属性可以开始。

     var field = req.body.fieldName; //want to set this for the field name="japanese2"
     var task = req.body.question; //want to set this for the name of the element="japanese2a"
     var myField = [task];
     field = myField; 
     var fieldPos = field[0];
.
.
.
db
 .collection("myCollection")
 .updateOne({username:username}, {"$set":{[fieldPos]:100}});

上面创建了一个名为"japanese2a":100"的新字段,但它没有出现在名为“japanese2”的字段下的数组中,这正是我想要的。

当我在控制台中执行上述操作时,我没有收到任何错误消息(可能主要是因为我没有输入错误语句/函数来捕获错误),但是 output 不正确。

我从这里找到的另一种更新方式: https://www.codementor.io/@prasadsaya/working-with-arrays-in-mongodb-16s303gkd3

这涉及使用这样的东西:

db.posts.updateOne( 
  { _id : ObjectId("5ec55af811ac5e2e2aafb2b9"), "comments.user": "Database Rebel" },
  { $set: { "comments.$.text": NEW_CONTENT } }
)

对我不起作用,因为我不知道数组中元素的初始值是否始终为零或其他常量。 最初数组中只有一个元素。 我只能将用户名用于更新中的匹配部分。 我无法创建一个与数组中的某些元素完美匹配的表达式。

来自这里的更新解决方案: MongoDB 更新嵌套字段中的数据

db.users.update ({_id: '123'}, { '$set': {"friends.0.emails.0.email" : '2222'} });

工作,这就是我在上面的第一次更新尝试中成功更新的内容,但我不知道如何将变量合并到更新操作中,特别是保存数组的字段名称(“japanese2”)的变量或object,以及数组/对象(“japanese2a”)中第一个也是唯一一个元素/属性的名称。

已编辑:我最初要求为“数组”提供解决方案,但是在我的情况下,充当数组(包含充当对象的元素)或 object(将其他对象作为属性)的字段都可以工作,所以我编辑了问题正文和标题。 此外,可接受的解决方案将字段用作包含数组的实体,或用作其中包含 object 的实体。

在任何一种情况下,如果已经有一个具有适当名称的字段,则会创建一个 object(如果它不存在)作为该 object 的 object 或称为“对象”属性的数组根据脚本中的变量设置。

如果该字段不存在,则创建它(作为对象),并且此 object 包含另一个包含属性的 object(名称为“task”,名称-值对的值为“100”)。 因此,新创建的“字段” object 包含一个 object 作为其属性。 这个 object 的属性是“japanese2a”和“100”的名称-值对。

如果脚本再次运行,使用不同的“任务”名称(例如“japanese2b”),则会创建另一个属性,名称为“japanese2b”,值为“100”。 It is created within that same object that is "inside" the "field" object, so the object field.0 (the object within the "field" object) ends up looking like this: {japanese2a: 100, japanese2b: 100} . 而名为“字段”的 object 看起来像这样: {{japanese2a: 100, japanese2b: 100}}

我想像

var field = req.body.fieldName // japanese2
var task = req.body.question; // japanese2a
var updateObj = { $set : {} };

updateObj.$set[field + '.0.' + task] = 100

db
  .collection("myCollection")
  .updateOne({username:username}, updateObj);

可能工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM