MongoDb更新同一阵列中的多个特定嵌入式文档

Chazt3n

我有一个用例,其中一个视图允许用户更新多个对象并立即提交,我该如何使其原子化?

{_id: parent,
 childrenA: [
   {_id: child1, property: "update-me", property2: "leave-alone"},
   {_id: child2, property: "leave-alone", property2: "update-me"}
 ],
 propertyA: "update-me",
 propertyB: "leave-alone", //someone else needs to be able to update this concurrently with this change.
 childrenB:[
   {property: "update-me", property2: "leave-alone"},
   {property: "leave-alone", property2: "update-me"}
 ],

}

属性可以是也可以不是嵌套对象的另一个数组。这有可能通过编程吗?

编辑:我需要提及的是,在某些情况下,我无法可靠地更新整个文档,可以替换嵌入的文档(可能是地址)

但是,我需要汇总更改列表,例如[{"child[Id=child1].FirstName", "newName"},{"child[Id=child3].LastName", "newName"}(不一定是语法,而是更改字典)

ΝΝιΓΞΗΛψΚ

就我所知,这可以做一个限制。如果我错了,请有人纠正我。这是更新命令:

db.Parents.update(
    {
        "_id": ObjectId("5cf7391a1c86292244c4424e"),
        "ChildrenA": {
            "$elemMatch": {
                "_id": ObjectId("5cf7391a1c86292244c4424c")
            }
        }
    },
    {
        "$set": {
            "ChildrenA.$.Property": "UPDATED",
            "PropertyA": "UPDATED",
            "ChildrenB.0.Property": "UPDATED",
            "ChildrenB.1.Property2": "UPDATED"
        }
    }
)

如您所见,您必须使用$elemMatchID来定位嵌套子对象。从我可以告诉您的信息来看,一个更新命令中只能有一个$ elemMatch(如果我错了,请纠正我)。

这是生成上述更新命令的C#代码。它使用的是MongoDB.Entities,这是我编写的便捷库。

using MongoDB.Entities;

namespace StackOverflow
{
    public class Program
    {
        public class Parent : Entity
        {
            public ChildA[] ChildrenA { get; set; }
            public string PropertyA { get; set; }
            public string PropertyB { get; set; }
            public ChildB[] ChildrenB { get; set; }
        }

        public class ChildA : Entity
        {
            public string Property { get; set; }
            public string Property2 { get; set; }
        }

        public class ChildB
        {
            public string Property { get; set; }
            public string Property2 { get; set; }
        }

        static void Main(string[] args)
        {
            new DB("test");

            var childA = new ChildA { Property = "update-me", Property2 = "leave-me-alone" };
            var childB = new ChildA { Property = "leave-alone", Property2 = "update-me" };
            childA.Save(); childB.Save();

            var parent = new Parent
            {
                ChildrenA = new[] { childA, childB },
                PropertyA = "update-me",
                PropertyB = "leave-me-alone",
                ChildrenB = new[] {
                new ChildB{ Property = "update-me", Property2 = "leave-me-alone"},
                new ChildB{ Property = "leave-alone", Property2 = "update-me"}
                }
            };
            parent.Save();

            DB.Update<Parent>()
              .Match(
                f => f.Eq(p => p.ID, parent.ID) &
                f.ElemMatch(
                    x => x.ChildrenA, 
                    x => x.ID == childA.ID))
              .Modify(x => x.ChildrenA[-1].Property, "UPDATED")
              .Modify(x => x.PropertyA, "UPDATED")
              .Modify(x => x.ChildrenB[0].Property, "UPDATED")
              .Modify(x => x.ChildrenB[1].Property2, "UPDATED")
              .Execute();
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB嵌入式文档数组:仅获取一个具有特定属性的嵌入式文档

使用mgo对mongoDB中的嵌入式文档进行部分更新

ArangoDB AQL:更新嵌入式阵列中的单个对象

更新Mongodb中的嵌入式文档:性能问题?

如何在mongoDB中的嵌入式文档中提取特定元素

mongodb聚合中的项目嵌套嵌入式文档

基于范围查询MongoDB中嵌入式文档的数组

MongoDB查询以查找多个嵌入式文档

MongoDB-在嵌入式文档中找不到特定字段

如何在mongodb中搜索嵌入式文档?

查询Spring Data MongoDB中嵌入式文档的数组

在MongoDB中的多个文档中更新多个嵌入式文档

更新mongodb中arrays对象的arrays的嵌入式文档

在mongodb nodejs中更新双嵌套的嵌入式文档,而无需使用数字索引

MongoDB C#驱动程序-更新嵌入式文档数组中的所有字段

如何在嵌入式数组mongodb中查询嵌入式文档

将不同集合的文档存储在同一阵列中

在mongodb中更新嵌套的嵌入式文档

确保mongodb中嵌入式文档中的唯一索引

返回特定的mongodb嵌入式文档

mongodb与嵌入式文档的一对多关系

如何在MongoDB中的嵌入式文档中获得同一级别的所有字段

查询MongoDB中的嵌入式文档

通过嵌入式阵列MongoDB更新/迭代

嵌入式文档中的批量更新

使用python(pymongo)在mongodb中编辑嵌入式文档

在mongodb中展开嵌入式文档

MongoDB-更新嵌入式文档和文档本身

如何在 MongoDb 中查询嵌入式文档?

TOP 榜单

热门标签

归档