Mongo将成员添加到子文档数组,如果它不存在则创建整个文档?

时间:2014-07-30 14:20:06

标签: mongodb pymongo

我想将成员添加到MongoDB的子文档中的数组中,如果子文档本身不存在,我希望创建它。请采取以下措施:

{
    curvename: "France",
    dates: [
        {
            date: "2014-07-01",
            members: ["m1", "m2", "m3"]
        },
        {
            date: "2014-07-02",
            members: ["m1", "m2", "m3"]
        },
        {
            date: "2014-07-03",
            members: ["m1", "m2", "m3"]
        }
    ]
}

现在我想在每个日期添加“m4”和“m5”,但也包括“2014-07-04”,所以我想添加这个:

    dates:  [{
                date: "2014-07-01",
                members: ["m4", "m5"]
            },
            {
                date: "2014-07-02",
                members: ["m4", "m5"]
            },
            {
                date: "2014-07-03",
                members: ["m4", "m5"]
            },
            {
                date: "2014-07-04",
                members: ["m4", "m5"]
            }]

to get this:

{
    curvename: "France",
    dates: [
        {
            date: "2014-07-01",
            members: ["m1", "m2", "m3", "m4", "m5"]
        },
        {
            date: "2014-07-02",
            members: ["m1", "m2", "m3", "m4", "m5"]
        },
        {
            date: "2014-07-03",
            members: ["m1", "m2", "m3", "m4", "m5"]
        },
        {
            date: "2014-07-04",
            members: ["m4", "m5"]
        }

    ]
}

这可以在一个查询中完成吗?

我正在尝试各种$ each,$ addToSet和$ set的排列,使用Upsert,到目前为止没有运气。这是我现在拥有的(pymongo):

for d in daterange:
    curves.update({"curvename":curvename}, \
    {"$addToSet": {"date": d, "members": {"$each": members}}},
            upsert = True)

这是添加所有日期,但成员只在结尾处添加一次。完全错了。

以上是否可以在一个查询中完成?如何将新成员添加到我的每个日期,但是如果日期不存在,请创建它们并添加成员?

我更喜欢pymongo解决方案,但mongo控制台也会很好。

2 个答案:

答案 0 :(得分:1)

对于通用可变长度数组,目前在MongoDB中不能这样做(2.6)。对数组的更新需要使用$位置运算符或具体索引来定位特定的数组元素。

答案 1 :(得分:0)

试试这个:db.curves.update({'curvename':“France”},{$ push:{“dates.0.members”:“m1”}})

上面的查询可以将m1添加到成员数组,并且就像成员:[“m1”,“m4”,“m5”]

点击此链接:Mongodb update deeply nested subdocument 还阅读评论部分