我目前正在研究我们的持久化器以更新答案选项,我有以下代码:
public async Task Update(ItemList list, Guid id, Option option, CancellationToken cancellationToken = default)
{
var filter = Builders<ItemList>.Filter.And(
Builders<ItemList>.Filter.Eq("_id", list.Id),
Builders<ItemList>.Filter.Eq("Items._id", id)
);
var update = Builders<ItemList>.Update.Set("Items.$[i].Options.$[j]", option);
var arrayFilters = new List<ArrayFilterDefinition<ItemList>>
{
new BsonDocumentArrayFilterDefinition<ItemList>(
new BsonDocument("i._id", elementId)
),
new BsonDocumentArrayFilterDefinition<ItemList>(
new BsonDocument("j._id", option.Id)
)
};
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
await _collection.UpdateOneAsync(filter, update, updateOptions, cancellationToken);
}
在数据库中,我们存储的 ids 是 guid 结构,如下所示:
{
"_id": "ae39e133-18a6-43b0-8745-b13a00dd8632",
“ItemId”: "af21eeb1-e952-4e10-af59-b13800cf8880",
“Items”: [
{
"_t": “Item”,
"_id": "e42f593e-1444-4f3a-9991-b15d008d9a99",
"Options": [
{
"_id": "7dcccc2e-949a-4743-bd53-b15d008d9aa5",
"Label": “test”,
"Value": "a4e1c768-6cf9-417d-82bd-275c92be6a91",
}
}
]
}
]
}
将查询放入 3t studio 中,它给了我 MongoInvalidArgumentError: 更新文档需要原子运算符,这是正在执行的记录查询,c# 驱动程序不会给出任何错误。
db.getCollection("Defintion").updateOne(
{ "update" : "Defintion", "ordered" : true, "$db" : "dbName", "lsid" :
{ "id" : CSUUID("28fd5c50-4d0b-4a71-a2d4-d6c598b6f413") },
"updates" : [{ "q" : { "_id" : "ae39e133-18a6-43b0-8745-b13a00dd8632", "Items._id" : "e42f593e-1444-4f3a-9991-b15d008d9a99" },
"u" : { "$set" : { "Items.$[i].Options.$[j]" :
{ "_id" : "7dcccc2e-949a-4743-bd53-b15d008d9aa5", "Label" : "Test2", "Value" : "a4e1c768-6cf9-417d-82bd-275c92be6a91"} } },
"arrayFilters" : [{ "i._id" : CSUUID("e42f593e-1444-4f3a-9991-b15d008d9a99") }, { "j._id" : CSUUID("7dcccc2e-949a-4743-bd53-b15d008d9aa5") }] }] }
)
在 studio 3T 中,对于给定的示例,您可以使用以下更新命令:
db.getCollection("Defintion").updateOne(
{ "_id" : "ae39e133-18a6-43b0-8745-b13a00dd8632", "Items._id" : "e42f593e-1444-4f3a-9991-b15d008d9a99" },
{ "$set" : { "Items.$[i].Options.$[j]" : { "_id" : "7dcccc2e-949a-4743-bd53-b15d008d9aa5", "Label" : "Test2", "Value" : "a4e1c768-6cf9-417d-82bd-275c92be6a91"} }},
{ "arrayFilters" : [{ "i._id" : "e42f593e-1444-4f3a-9991-b15d008d9a99" }, { "j._id" : "7dcccc2e-949a-4743-bd53-b15d008d9aa5" }]}
)
更新语法如下来自文档:
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>,
let: <document>
}
)