将元素插入 Mongodb 中的嵌套数组
Insert element into nested array in Mongodb
我有这个:
{
"_id" : ObjectId("4fb4fd04b748611ca8da0d48"),
"Name" : "Categories",
"categories" : [{
"_id" : ObjectId("4fb4fd04b748611ca8da0d46"),
"name" : "SubCategory",
"sub-categories" : [{
"_id" : ObjectId("4fb4fd04b748611ca8da0d47"),
"name" : "SubSubCategory",
"standards" : []
}]
}]
}
我想使用 C# 驱动程序添加一个新的 SubCategory。有没有最佳的方法来做到这一点?
您可以使用 FindOneAndUpdateAsync
和位置运算符
来完成此操作
public async Task Add(string productId, string categoryId, SubCategory newSubCategory)
{
var filter = Builders<Product>.Filter.And(
Builders<Product>.Filter.Where(x => x.Id == productId),
Builders<Product>.Filter.Eq("Categories.Id", categoryId));
var update = Builders<Product>.Update.Push("Categories.$.SubCategories", newSubCategory);
await collection.FindOneAndUpdateAsync(filter, update);
}
为我的案例添加示例。确实有效,但在进入数组时没有美元符号:
public async Task AddCustomMetadata()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("EntityCustomMetadataFieldId", "5bf81296-feda-6447-b45a-08d5cb91211c");
var filter = Builders<BsonDocument>.Filter.Eq("_id", "6c7bb4a5-d7cc-4a8d-aa92-b0c89ea0f7fe");
var update = Builders<BsonDocument>.Update.Push("CustomMetadata.Fields", dic);
await _context.BsonAssets.FindOneAndUpdateAsync(filter, update);
}
您也可以通过 Linq 表达式使用位置运算符:
public async Task Add(string productId, string categoryId, SubCategory newSubCategory)
{
var filter = Builders<Product>.Filter.And(
Builders<Product>.Filter.Where(x => x.Id == productId),
Builders<Product>.Filter.ElemMatch(x => x.Categories, c => c.Id == categoryId));
var update = Builders<Product>.Update.Push(x => x.Categories[-1].SubCategories, newSubCategory);
await collection.FindOneAndUpdateAsync(filter, update);
}
并让自己摆脱在字符串中使用硬编码的 属性 名称。
我有这个:
{
"_id" : ObjectId("4fb4fd04b748611ca8da0d48"),
"Name" : "Categories",
"categories" : [{
"_id" : ObjectId("4fb4fd04b748611ca8da0d46"),
"name" : "SubCategory",
"sub-categories" : [{
"_id" : ObjectId("4fb4fd04b748611ca8da0d47"),
"name" : "SubSubCategory",
"standards" : []
}]
}]
}
我想使用 C# 驱动程序添加一个新的 SubCategory。有没有最佳的方法来做到这一点?
您可以使用 FindOneAndUpdateAsync
和位置运算符
public async Task Add(string productId, string categoryId, SubCategory newSubCategory)
{
var filter = Builders<Product>.Filter.And(
Builders<Product>.Filter.Where(x => x.Id == productId),
Builders<Product>.Filter.Eq("Categories.Id", categoryId));
var update = Builders<Product>.Update.Push("Categories.$.SubCategories", newSubCategory);
await collection.FindOneAndUpdateAsync(filter, update);
}
为我的案例添加示例。确实有效,但在进入数组时没有美元符号:
public async Task AddCustomMetadata()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("EntityCustomMetadataFieldId", "5bf81296-feda-6447-b45a-08d5cb91211c");
var filter = Builders<BsonDocument>.Filter.Eq("_id", "6c7bb4a5-d7cc-4a8d-aa92-b0c89ea0f7fe");
var update = Builders<BsonDocument>.Update.Push("CustomMetadata.Fields", dic);
await _context.BsonAssets.FindOneAndUpdateAsync(filter, update);
}
您也可以通过 Linq 表达式使用位置运算符:
public async Task Add(string productId, string categoryId, SubCategory newSubCategory)
{
var filter = Builders<Product>.Filter.And(
Builders<Product>.Filter.Where(x => x.Id == productId),
Builders<Product>.Filter.ElemMatch(x => x.Categories, c => c.Id == categoryId));
var update = Builders<Product>.Update.Push(x => x.Categories[-1].SubCategories, newSubCategory);
await collection.FindOneAndUpdateAsync(filter, update);
}
并让自己摆脱在字符串中使用硬编码的 属性 名称。