[英]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.