I’am currently working on our persisters to update an answer option, I have the following code:
<code>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);
}
</code>
<code>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);
}
</code>
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);
}
In the database we store ids are guids structure looks like this:
<code>{
"_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",
}
}
]
}
]
}
</code>
<code>{
"_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",
}
}
]
}
]
}
</code>
{
"_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",
}
}
]
}
]
}
Putting the query in 3t studio it gives me MongoInvalidArgumentError: Update document requires atomic operators, this is a logged query that is being executed, c# driver does not give any error.
<code>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") }] }] }
)
</code>
<code>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") }] }] }
)
</code>
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") }] }] }
)
7