khe*_*eya 10 mongodb mongodb-query mongodb-.net-driver
这是我收藏中的一个示例文档:
Books
[
id: 1,
links:
[
{text: "ABC", "url": "www.abc.com"},
{text: "XYZ", "url": "www.xyz.com"}
]
]
Run Code Online (Sandbox Code Playgroud)
我想在一次更新操作中替换 links 数组。以下是如何修改上述文档的示例:
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"}
]
]
Run Code Online (Sandbox Code Playgroud)
如您所见,链接数组已被替换(删除旧数据,添加新数据)。
我很难用,Update.Set()因为它说它MyLinks<>不能映射到BsonValue
我尝试了许多不同的方法来实现这一目标,但都失败了,包括.PushAllWrapped<WebLinkRoot>("links", myDoc.WebLinks). 我尝试过的所有方法都会将新值附加到数组中,而不是替换数组。
由于 MongoDB 似乎没有提供一种简单的方法来替换子文档数组或类似的方法.ClearArray(),那么在单个查询中添加新元素之前确保清除数组的最佳方法是什么?
我来这里是因为我在这篇文章上看到了 5k 次浏览,我正在添加一些东西可能会帮助其他寻找上述答案的人
db.collectionName.insertOne({
'links': [
{
"text" : "XYZ",
"url" : "www.xyz.com"
}
]
});
Run Code Online (Sandbox Code Playgroud)
现在运行此查询有助于替换旧数据
db.collectionName.update(
{
_id: ObjectId("your object Id")
},
{
$set:
{
'links':[ {
"text" : "XYZ1",
"url" : "www.xyz.com1"
} ]
}
});
Run Code Online (Sandbox Code Playgroud)
我认为你必须做这样的事情:
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 );
Run Code Online (Sandbox Code Playgroud)
或者您可以将任何方法转换为有效的 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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
所以这有效。
除了嵌入代码之外,您显然还需要其他东西。但希望这能让你走上正轨。
| 归档时间: |
|
| 查看次数: |
9618 次 |
| 最近记录: |