我有一个这样的文件:
{
"_id" : UUID("f599b3fa-4c10-42ae-b9cd-b329aafa266b"),
"Title" : "Prod 1",
"Variants" : [
{
"_id" : UUID("a67073af-68a6-4b5d-89da-1736b1def4e0"),
"CategoryImageId" : UUID("00000000-0000-0000-0000-000000000000"),
"ImageName" : null
},
{
"_id" : UUID("a04cb54e-d171-4a00-8c29-8e55b930ced0"),
"CategoryImageId" : UUID("00000000-0000-0000-0000-000000000000"),
"ImageName" : null
}
]
}
我编写了一个函数来更新
CategoryImageId
和 ImageName
在单个变体中,但它不起作用。
我的职能是:
public async Task<OperationResult> UpdateImageAssociationAsync(Guid productId, Guid productVariantId, Guid categoryImageId,
string imageName)
{
try
{
var productsCollection = database.GetCollection<Product>(nameof(Product));
if (productsCollection == null)
return new OperationResult(false, $"Collection {nameof(Product)} non trovata");
var filter = Builders<Product>.Filter.Where(x => x.Id == productId && x.Variants.Any(pv => pv.Id == productVariantId));
var updateFilter = Builders<Product>.Update
.Set("Variants.[-1].CategoryImageId", categoryImageId)
.Set("Variants.[-1].ImageName", imageName);
var res = await productsCollection.UpdateOneAsync(filter, updateFilter);
return new OperationResult(res.ModifiedCount > 0);
}
catch (Exception ex)
{
return new OperationResult(false,
$"ErrorMessage: {ex.Message}{Environment.NewLine}StackTrace: {ex.StackTrace}");
}
}
我怀疑问题出在
updateFilter
,但我不知道如何解决它。
您的更新查询不正确。没有
[-1]
语法。相反,您应该使用 arrayFilters
和 $[<identifier>]
过滤位置运算符,如下所示:
var filter = Builders<Product>.Filter.Where(x => x.Id == productId
&& x.Variants.Any(pv => pv.Id == productVariantId));
var updateFilter = Builders<Product>.Update
.Set("Variants.$[variant].CategoryImageId", categoryImageId)
.Set("Variants.$[variant].ImageName", imageName);
var res = await productsCollection.UpdateOneAsync(filter,
updateFilter,
new UpdateOptions
{
ArrayFilters = new List<ArrayFilterDefinition<Variant>>
{
new BsonDocumentArrayFilterDefinition<Variant>(
new BsonDocument("variant._id", BsonValue.Create(productVariantId))
)
}
});