使用$ setOnInsert - mongoDB更新文档时出错

时间:2014-05-01 11:31:42

标签: java mongodb

我使用$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

在2.4.8

中更新文档后
   {
     "_id" : ObjectId("536113766a47069648b4695d"),
     "request" : [
            {
              "currentVisit" : "1398254762",
              "lastVisit" : "1398254762"
            }
      ],
     "session" : "1",
     "uuid" : "113862726056042"
    }

版本有任何问题。

任何建议都将不胜感激。

2 个答案:

答案 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语句以检测其设置。