MongoDB .NET 驱动程序 - 更新嵌套子数组文档中的字段

问题描述 投票:0回答:1

我有一个这样的文件:

{
    "_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
,但我不知道如何解决它。

c# mongodb linq .net-core mongodb-.net-driver
1个回答
1
投票

您的更新查询不正确。没有

[-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))
            )
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.