【问题标题】:How do I update an array of strings within an array of objects using ObjectId in mongodb?如何在 mongodb 中使用 ObjectId 更新对象数组中的字符串数组?
【发布时间】:2021-05-13 09:49:23
【问题描述】:

我无法理解如何在 mongoDB 的数组对象中更新标签数组。

我有一个对象数组及其对应的 ObjectID,我想在 mongoDB 上更新哪些标签。我尝试的是使用一个循环,使用 updateOne 指定 ObjectID 作为查询来查找相应的文档。

类似这样的:

nodes.forEach(node => {
   const query = { '_id' : ObjectId(node.Id) }

   db.collection(collection).updateOne(
      query,
      { $set: { 'tags': value } },
      function(err, result) {
        if (err) {
            throw err;
        }
        console.log(result);
     });
  });

不幸的是,这不起作用。我尝试了其他方法,但找不到任何有效的方法

我有以下mongodb数据结构:

{
"_id": {
  "$oid": "6022bc9f9b55276bd39f4e0"
},
"name": "TestProject",
"projectData": {
  "nodes": [
    {
      "data": {
        "_id": {
          "$oid": "6022bc959b559276bd39f4be"
        },
        "nodeData": {
          "tags": []
        }
      }
    },
    {
      "data": {
        "_id": {
          "$oid": "7022bc959b559276bd39f4ce"
        },
        "nodeData": {
          "tags": []
        }
      }
    },
    {
      "data": {
        "_id": {
          "$oid": "8022bc959b559276bd39f4de"
        },
        "nodeData": {
          "tags": []
        }
      }
    }
  ....
  ]
}

我只想更新与我作为 ObjectID 传入的对象匹配的特定对象标签。 更新与特定 ObjectID 匹配的一堆对象值的最佳方法是什么?

【问题讨论】:

    标签: arrays mongodb objectid


    【解决方案1】:

    您可以使用过滤后的位置运算符$[<identifier>] 标识与arrayFilters 条件匹配的数组元素以进行更新操作。

    • 如果您在每个节点 ID 中更新相同的标签而不是尝试$in 条件,否则您可以使用bulkWrite() 操作。
    let value = ["tag1", "tag2"];
    let nodes = [
      ObjectId("6022bc959b559276bd39f4be"),
      ObjectId("7022bc959b559276bd39f4ce")
    ];
    
    db.collection(collection).updateOne(
      {},
      { $set: { "projectData.nodes.$[d].data.nodeData.tags": value } },
      {
        arrayFilters: [
          { "d.data._id": { $in: nodes } }
        ]
      }
    )
    

    Playground

    【讨论】:

    • 每个节点的标签内容可能不同,我该如何在 bulkWrite 操作中做到这一点?
    • 谢谢!我试过这个解决方案,效果很好!
    【解决方案2】:

    为了完整起见,我想为此添加自己的解决方案。 根据接受的答案,我构建了以下操作,因为每个节点可能有不同的标签,我希望每次都能添加到标签中:

    const ObjectID = require('mongodb').ObjectID;
    
    nodes.forEach(node => {
      updateOneObjectWithTags(db, node._id, "projectData.nodes.$[d].data.nodeData.tags", node.nodeData.tags, "d.data._id", collection).then(result => {
        console.log(result);
      });
    });
    
    
    updateOneObjectWithTags: (db, objectId, updateKey, updateValue, arrayFilterKey, collection) => {
      return new Promise((resolve, reject) => {
        db.collection(collection).updateOne(
        {},
        {
          $set: {
            [updateKey] : updateValue
          }
        },
        {
          arrayFilters: [
            {
              [arrayFilterKey]: new ObjectID(objectId)
            }
          ]
        })
        resolve(true);
      });
    

    【讨论】:

      猜你喜欢
      • 2018-06-26
      • 2020-11-13
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多