我有一个带有如下所示条目的集合。
{
"_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]
这可以通过单次更新吗?
答案 0 :(得分:1)
monthly_activity
是一个数组,因此您需要使用位置值/运算符引用元素。
要识别更新字段,您只能使用位置运算符 $
一次,即使该字段嵌套在数组(a current limitation)中也是如此。这将要求您知道层次结构中其他数组元素的位置。在这种情况下,您需要知道monthly_activity
或daily_stats
的位置。
如果您拥有monthly_activity
元素的位置(例如0),那么您可以通过monthly_activity.0.daily_stats.$.stats
标识更新字段。
位置$运算符不能用于遍历的查询 多个数组,例如遍历嵌套数组的查询 在其他数组中,因为$ placeholder的替换是 一个单一的价值。