带有Java驱动程序的MongoDB - 使用$ addToSet和updateOne将新集添加到嵌套数组

时间:2016-10-06 09:09:06

标签: java arrays mongodb

我有一个带有如下所示条目的集合。

{
"_id" : ObjectId("57f6021caa3e1d3ee099af0d"),
"user" : "JBL123",
"name" : "Joe Bloggs",
"monthly_activity" : [
    {
        "month" : "September2016",
        "status" : "active",
        "daily_stats" : [
            {
                "date" : "27/SEP/2016",
                "stats" : [ 
                    {
                        "category":
                        "stat1":
                        "stat2":
                    },
                    {
                        "category":
                        "stat1":
                        "stat2":
                    }
                ]
            },
            {
                "date" : "28/SEP/2016",
                "stats" : [ 
                    {
                        "category": ...
                        "stat1": ...
                        "stat2": ...
                    },
                    {
                        "category": ...
                        "stat1": ...
                        "stat2": ...
                    }
                ]
            },
        ],
        "extra_fields": ....
    }
]
}

我想在指定日期插入新类别的统计信息。

我尝试过以下

mdb.getCollection("users").updateOne(new Document("user", "JBL123").append("monthly_activity.daily_stats.date", "27/SEP/2016"),
    new Document("$addToSet", (new Document("monthly_activity.daily_stats.$.stats",
        new Document("category",cat)
            .append("stat1", s1)
            .append("stat2", s2)))));

但它不喜欢使用点表示法来访问数组的子数组。我收到以下错误...

  
    

线程“main”中的异常com.mongodb.MongoWriteException:无法使用字符串字段名称附加到数组[daily_stats]

  

这可以通过单次更新吗?

1 个答案:

答案 0 :(得分:1)

monthly_activity是一个数组,因此您需要使用位置值/运算符引用元素。

要识别更新字段,您只能使用位置运算符 $ 一次,即使该字段嵌套在数组(a current limitation)中也是如此。这将要求您知道层次结构中其他数组元素的位置。在这种情况下,您需要知道monthly_activitydaily_stats的位置。

如果您拥有monthly_activity元素的位置(例如0),那么您可以通过monthly_activity.0.daily_stats.$.stats标识更新字段。

  

位置$运算符不能用于遍历的查询   多个数组,例如遍历嵌套数组的查询   在其他数组中,因为$ placeholder的替换是   一个单一的价值。