在C#MongoDB中插入嵌套数组

时间:2017-05-21 21:33:10

标签: c# json mongodb mongodb-.net-driver

我在MongoDB中名为document的集合中有以下Users。我正在尝试将<SpecificBeer>插入beersInCellar[] mycellar的{​​{1}}。我在cellarfilter对象中尝试了各种组合,但是无法将我的头部插入到嵌套数组中。我知道如何update find并将内容插入其中,而不是插入该文档中的数组中。

document

SpecificBeer模型:

{
    "_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; }
        }

1 个答案:

答案 0 :(得分:2)

您必须使用$positional运算符。

您必须在{mongoDB的cellarId中包含字段(cellars)以找到元素的索引,并使用查询部分中找到的索引替换占位符($)在更新部分中推送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在数组内的嵌套数组中没有更新字段(例如quantity)的一流支持。

您可以跟踪允许多级更新的jira。

https://jira.mongodb.org/browse/SERVER-27089

您现在可能想要重新访问您的结构。尝试将beersInCellar数组提升到最高级别。