在 C# 中插入嵌套数组 MongoDB
Insert into nested array in C# MongoDB
我在 MongoDB 中名为 Users
的集合中有以下 document
。我正在尝试将 <SpecificBeer>
插入到 mycellar
cellar
的 beersInCellar[]
中。我已经在 filter
和 update
对象中尝试了各种组合,但就是无法将我的头围绕在嵌套数组中插入。我知道如何 find
a document
并将内容插入其中,只是不插入该文档中的数组。
{
"_id" : ObjectId("5920751b6d4f6a27cf7985a8"),
"name" : "FullName",
"emailAddress" : "emailaddress@example.com",
"cellars" : [
{
"cellarId" : "mycellar",
"cellarName" : "My Cellar",
"beersInCellar" : [ ]
}
]
}
特定啤酒型号:
public class SpecificBeer
{
public string ourid
{
get
{
return ID.ToString();
}
set
{
ID = ObjectId.Parse(value);
}
}
[BsonId]
private ObjectId ID {get; set;}
public string year { get; set; }
public string variant { get; set; }
public string quantity { get; set; }
public string numberForTrade { get; set; }
}
插入方法
public async Task<SpecificBeer> AddBeerToList(string id, SpecificBeer specificBeer, string cellarId)
{
var filter = Builders<User>.Filter.Eq(e => e.userId, id) & Builders<User>.Filter.Eq(e => e.cellars, cellarId);
var update = Builders<Cellar>.Update.Push<SpecificBeer>(e => e.beersInCellar, specificBeer);
await _collection.FindOneAndUpdateAsync(filter, update);
return specificBeer;
}
您必须使用 $positional 运算符。
您必须为 mongoDB 包含 cellars
中的字段 (cellarId
) 以找到元素的索引并将占位符 ($
) 替换为从更新部分的查询部分找到的索引将元素推送到 beersInCellar
.
类似
var filter = Builders<User>.Filter.Eq(e => e.name, "FullName") & Builders<User>.Filter.ElemMatch(e => e.cellars, Builders<Cellar>.Filter.Eq(e => e.cellarId, "mycellar"));
var update = Builders<User>.Update.Push(e => e.cellars[-1].beersInCellar, specificBeer);
Shell查询参考:
db.collection.update({"name" : "FullName", "cellars":{$elemMatch:{"cellarId":"mycellar"}}},{$push:{"cellars.$.beersInCellar":{"quantity":1, "year":1986}}})
MongoDB 首先 class 不支持更新数组内嵌套数组中的字段(例如 quantity
)。
您可以跟踪将允许多级更新的 jira。
https://jira.mongodb.org/browse/SERVER-27089
您现在可能想重新审视您的结构。尝试将 beersInCellar
数组提升到顶层。
我在 MongoDB 中名为 Users
的集合中有以下 document
。我正在尝试将 <SpecificBeer>
插入到 mycellar
cellar
的 beersInCellar[]
中。我已经在 filter
和 update
对象中尝试了各种组合,但就是无法将我的头围绕在嵌套数组中插入。我知道如何 find
a document
并将内容插入其中,只是不插入该文档中的数组。
{
"_id" : ObjectId("5920751b6d4f6a27cf7985a8"),
"name" : "FullName",
"emailAddress" : "emailaddress@example.com",
"cellars" : [
{
"cellarId" : "mycellar",
"cellarName" : "My Cellar",
"beersInCellar" : [ ]
}
]
}
特定啤酒型号:
public class SpecificBeer
{
public string ourid
{
get
{
return ID.ToString();
}
set
{
ID = ObjectId.Parse(value);
}
}
[BsonId]
private ObjectId ID {get; set;}
public string year { get; set; }
public string variant { get; set; }
public string quantity { get; set; }
public string numberForTrade { get; set; }
}
插入方法
public async Task<SpecificBeer> AddBeerToList(string id, SpecificBeer specificBeer, string cellarId)
{
var filter = Builders<User>.Filter.Eq(e => e.userId, id) & Builders<User>.Filter.Eq(e => e.cellars, cellarId);
var update = Builders<Cellar>.Update.Push<SpecificBeer>(e => e.beersInCellar, specificBeer);
await _collection.FindOneAndUpdateAsync(filter, update);
return specificBeer;
}
您必须使用 $positional 运算符。
您必须为 mongoDB 包含 cellars
中的字段 (cellarId
) 以找到元素的索引并将占位符 ($
) 替换为从更新部分的查询部分找到的索引将元素推送到 beersInCellar
.
类似
var filter = Builders<User>.Filter.Eq(e => e.name, "FullName") & Builders<User>.Filter.ElemMatch(e => e.cellars, Builders<Cellar>.Filter.Eq(e => e.cellarId, "mycellar"));
var update = Builders<User>.Update.Push(e => e.cellars[-1].beersInCellar, specificBeer);
Shell查询参考:
db.collection.update({"name" : "FullName", "cellars":{$elemMatch:{"cellarId":"mycellar"}}},{$push:{"cellars.$.beersInCellar":{"quantity":1, "year":1986}}})
MongoDB 首先 class 不支持更新数组内嵌套数组中的字段(例如 quantity
)。
您可以跟踪将允许多级更新的 jira。
https://jira.mongodb.org/browse/SERVER-27089
您现在可能想重新审视您的结构。尝试将 beersInCellar
数组提升到顶层。