我使用$setOnInsert
更新了mongoDB。它在2.4 version of mongoDB
中工作,但它在2.6 version
中抛出错误。
BasicDBObject update = new BasicDBObject();
BasicDBObject visits = new BasicDBObject();
visits.append("request", getRequestInfo(input));//Some documents
update.append("$setOnInsert", {}).append("$push", visits);
collection.update(searchQuery, update, true, false);
java.lang.RuntimeException: com.mongodb.MongoException: '$setOnInsert' is empty. You must specify a field like so: {$mod: {: ...}}
Note:
我有两个mongoDB服务器。它在一台服务器上工作。它在另一个问题上给出了上述问题。 Only difference is version
。
{
"_id" : ObjectId("536113766a47069648b4695d"),
"request" : [
{
"currentVisit" : "1398254762",
"lastVisit" : "1398254762"
}
],
"session" : "1",
"uuid" : "113862726056042"
}
版本有任何问题。
任何建议都将不胜感激。
答案 0 :(得分:2)
所以这里的语法很好,充其量是有趣的。但我称之为边缘情况,而不是你应该如何调用它。更好的版本是:
BasicDBObject update = new BasicDBObject();
BasicDBObject visits = new BasicDBObject();
visits.append("request", getRequestInfo(input));//Some documents
update.append("$setOnInsert", new BasicDBObject("$push", visits));
collection.update(searchQuery, update, true, false);
我非常确定不会导致错误。
P.S :将此作为数组的一个非常有趣的结构。所以你可以评论是否有原因,但似乎实际上并不需要 $setOnInsert
,你可能只能留下标准 {{1}更新中的操作,除非你真的只想拥有一个数组元素。
答案 1 :(得分:2)
这是您所关注的问题:https://jira.mongodb.org/browse/SERVER-12266自2.5.4起适用。
由于此问题被标记为"按设计工作"。
最后一条评论是:
我今天与Scott Hernandez就此进行了交谈,他解释了围绕空修饰符的新严格性旨在提醒那些无意中发送空更新的用户。
相反,您应该放置代码:
append("$setOnInsert", {}).
进入if
语句以检测其设置。