c# - 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。我在哪里犯了错误?
解决方案
编辑:我认为在这种情况下不可能使用 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";
推荐阅读
- php - 显示具有某些条件的数据库字段
- typescript - Angular8 材质,带有标题和瓷砖的网格。mat-grid-tile 内容未完全调整大小
- node.js - 访问安装在 Linux 服务器上的 NodeJS 服务器
- mysql - 谷歌云 SQL 迁移到第二代导致读/写操作激增
- sql - 查询最近日期
- r - 如何应用机器学习技术/如何使用模型输出
- python - Python 从一个运行多个脚本
- sql - SQL - 具有多个日期的条件窗口
- ios - 将 Gif 从 URL 加载到 CollectionViewCell
- python - 如何从 seaborn 的 KDE distplot 对象中提取 bin?