【问题标题】:Mongo add members to a subdocument array, and create the whole document it if it does not exist?Mongo将成员添加到子文档数组中,如果不存在则创建整个文档?
【发布时间】:2014-08-02 03:11:34
【问题描述】:

我想在 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"]
        }

    ]
}

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

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

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

这是添加所有日期,但成员仅在末尾添加一次。完全错误。

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

我更喜欢 pymongo 解决方案,但 mongo 控制台也可以。

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    对于一般的变长数组,目前在 MongoDB(2.6)中无法做到这一点。对数组的更新需要使用$ 位置运算符或具体索引来定位特定的数组元素。

    【讨论】:

      【解决方案2】:

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

      上面的查询可以将 m1 添加到 members 数组中,就像 members: [ "m1","m4","m5"]

      查看此链接:Mongodb update deeply nested subdocument 另请阅读 cmets 部分

      【讨论】:

      • 如果我想添加到第一个以外的日期怎么办?这个“0”索引(“dates.0.members”)不会总是添加到第一个索引吗?还是我需要某种单独的查询?
      • 我不明白'不总是添加到第一个'?但是如果你想忽略第一个,你可以在循环时忽略它。
      猜你喜欢
      • 2019-12-31
      • 2017-01-20
      • 2021-09-13
      • 2014-07-29
      • 1970-01-01
      • 2019-02-16
      • 2019-04-16
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多