首页 > 解决方案 > C# MongoDB 使用 Pusheach 将数组添加到数组中,并结合位置标识符始终位于位置 0

问题描述

我正在尝试将数组添加到文档中的嵌套数组中。对于数组中的正确位置,我使用位置标识符进行更新。一切看起来都很好:找到了正确的文档,但数组总是添加到位置“0”而不是(在我下面的示例中添加到位置“1”)。我已经为此苦苦挣扎了几天,但找不到我犯的错误。也许有人可以给我线索。

这是文件:

{
    "_id" : ObjectId("5b3fad5fd38e401ae836497b"),
    "Supplier" : "5b367975d38e400a10d490ba",
    "MenuCard" : [ 
        {
            "CardDescription" : "Menu",
            "Category" : "Drinks",
            "Subcategory" : [ 
                {
                    "Title" : "Beer",
                    "Shortname" : "B",
                    "SubcategoryItems" : []
                }, 
                {
                    "Title" : "Wine",
                    "Shortname" : "W",
                    "SubcategoryItems" : []
                }
            ]
        }
    ]
}

我正在尝试将一个新数组插入到名为 Wine 的数组“SubcategoryItems”中:

public async Task<MongoResult> AddSubCategoryItemAsync(SubcategoryItem oAddNewSubCategoryItem)
{
    BsonDocument jsonSearch = new BsonDocument
    {
        { "Supplier", Customer},
        { "MenuCard.Category", Category },
        { "MenuCard.Subcategory.Title","Wine"}
    };

    SubcategoryItem oCategory = new SubcategoryItem { ItemId=oAddNewSubCategoryItem.ItemId,
                                                      ItemImageUrl=oAddNewSubCategoryItem.ItemImageUrl,
                                                      ItemName=oAddNewSubCategoryItem.ItemName,
                                                      ItemDescription=oAddNewSubCategoryItem.ItemDescription,
                                                      Price=oAddNewSubCategoryItem.Price};

    BsonArray doc = new BsonArray { new BsonDocument(oCategory.ToBsonDocument()) };

    try
    {
        var insert = Builders<BsonDocument>.Update.PushEach("MenuCard.0.Subcategory.$.SubcategoryItems", values: doc);
        var result = await _collection.UpdateOneAsync(jsonSearch, insert);

        return new MongoResult { Validate = true, Explanation = "SubCatItem added" };
    }
    catch (Exception e)
    {
        return new MongoResult { Validate = false, Explanation = e.ToString() };
    }
}

但是当我运行代码时,它总是将数组添加到“啤酒”会话中。

{
    "_id" : ObjectId("5b3fad5fd38e401ae836497b"),
    "Supplier" : "5b367975d38e400a10d490ba",
    "MenuCard" : [ 
        {
            "CardDescription" : "Menu",
            "Category" : "Drinks",
            "Subcategory" : [ 
                {
                    "Title" : "Beer",
                    "Shortname" : "B",
                    "SubcategoryItems" : [ 
                        {
                            "ItemId" : "AddA333",
                            "ItemImageUrl" : "WWW...",
                            "ItemName" : "White wine",
                            "ItemDescription" : "Dry",
                            "Price" : 1.46
                        }
                    ]
                }, 
                {
                    "Title" : "Wine",
                    "Shortname" : "W",
                    "SubcategoryItems" : []
                }
            ]
        }
    ]
}

我期待搜索为 $ 提供值 1,但它总是给出 0。我在哪里犯了错误?

标签: c#mongodb

解决方案


编辑:我认为在这种情况下不可能使用 PushEach 。我这样修复它:

    var resultBsons = await _collection.Find<BsonDocument>(jsonSearch)
        .Project(Builders<BsonDocument>.Projection
                                            .Exclude("_id"))
                                            .ToListAsync();

    JObject json = JObject.Parse(resultBsons[0].ToJson());
    JArray MenuCard = (JArray)json["MenuCard"];
    var SubCat = MenuCard.Values("Subcategory").ToArray();

    int nReturn = -1;
    for (int i = 0; i <= SubCat.Count(); i++)
    {
        if ((string)SubCat[0][i]["Title"] == "Wine")
        {
            nReturn = i;
            break;
        }
    }

    string insertString = "MenuCard.0.Subcategory."+nReturn.ToString()+".SubcategoryItems";

推荐阅读