繁体   English   中英

如何替换 MongoDB 中的整个子文档数组?

[英]How do I replace an entire array of subdocuments in MongoDB?

这是我收藏中的一个示例文档:

Books
[
   id: 1,
   links:
   [
     {text: "ABC", "url": "www.abc.com"},
     {text: "XYZ", "url": "www.xyz.com"}
   ]
]

我想在一次更新操作中替换链接数组。 以下是如何修改上述文档的示例:

Books
[
   id: 1,
   links:
   [
     {text: "XYZ", "url": "www.xyz.com"},
     {text: "efg", "url": "www.efg.com"},   <== NEW COPY OF THE ARRAY
     {text: "ijk", "url": "www.ijk.com"}
   ]
]

如您所见,链接数组已被替换(删除旧数据,添加新数据)。

我在使用Update.Set()时遇到了很多困难,因为它说MyLinks<>无法映射到BsonValue

我尝试了许多不同的方法来实现这一点,但都失败了,包括.PushAllWrapped<WebLinkRoot>("links", myDoc.WebLinks) 我尝试过的所有方法都会将新值附加到数组中,而不是替换数组。

由于 MongoDB 似乎没有提供一种简单的方法来替换子文档数组或类似.ClearArray()的方法,那么在单个查询中添加新元素之前确保清除数组的最佳方法是什么?

我来这里是因为我在这篇文章上看到了 5k 次浏览,我正在添加一些东西可能会帮助其他寻找上述答案的人

 db.collectionName.insertOne({
      'links': [
                 {
                     "text" : "XYZ",
                      "url" : "www.xyz.com"
                  }
        ]
  });

现在运行此查询有助于替换旧数据

db.collectionName.update(
      {
        _id: ObjectId("your object Id")
      }, 
      {
        $set: 
         {
          'links':[ {
                     "text" : "XYZ1",
                     "url" : "www.xyz.com1"
                   } ]
         }
      });

我认为你必须做这样的事情:

var newArray = new BSONArray {
    new BSONDocument { { "text", "XYZ" }, { "url", "www.xyz.com" } },
    new BSONDocument { { "text", "efg" }, { "url", "www.efg.com" } },
    new BSONDocument { { "text", "ijk" }, { "url", "www.ijk.com" } }
};

var update = Update.Set( "links", newArray );

collection.Update( query, update );

或者您可以将任何方法转换为有效的 BSONValue。

所以相当于shell:

{ "links" : [ { "text" : "abc" } ] }

> db.collection.update(
      {},
      { $set: 
          { links: [ 
              { text: "xyz", url: "something" },
              { text: "zzz", url: "else" }
          ]}
      })

>db.collection.find({},{ _id: 0, links:1 }).pretty()

{ "links" : [
            {
                    "text" : "xyz",
                    "url" : "something"
            },
            {
                    "text" : "zzz",
                    "url" : "else"
            }
    ]
}

所以这有效。

除了嵌入代码之外,您显然还需要其他东西。 但希望这能让你走上正轨。

暂无
暂无

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

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