0

我对scala和cashbah都是新手。我在尝试着

  • 如果存在(通过_id)更新文档,如果不存在则创建。
  • 更新时,更新一些键值
  • 在更新时,更新一些值是集合的键,将一些数据包含到这些集合中。

为了实现这一点,我写了这个:

DBObject = MongoDBObject("_id" -> uri.toString) ++
      $addToSet("appearsOn" -> sourceToAppend) ++
      $addToSet("hasElements" -> elementsToAppend) ++
      $addToSet("hasTriples" -> triplesToAppend) ++
      MongoDBObject("uDate" -> new DateTime)

    /* Find and replace here! */
    OntologyDocument.dao.collection.findAndModify(
      query = MongoDBObject({"_id" -> uri.toString}),
      update = update,
      upsert = true,
      fields = null,
      sort = null,
      remove = false,
      returnNew = true
    )

查看的文档,添加并更新_id了一些新项目。appearsOn hasElements hasTriplesuDate

sourceToAppend elementsToAppend并且triplesToAppendList[String]

当我运行这个时,我得到了这个错误:

java.lang.IllegalArgumentException: fields stored in the db can't start with '$' (Bad Key: '$addToSet')
    at com.mongodb.DBCollection.validateKey(DBCollection.java:1444) ~[mongo-java-driver-2.11.1.jar:na]

我没明白。这个查询有什么问题?$addToSet不是领域,为什么 casbah 认为它是领域?我在这里做错了什么?

4

1 回答 1

2

它失败的原因是因为更新查询无效(它不会在 js shell 中工作)。

$set对于更新文档中的值是隐含的,但您不能将其与其他更新运算符混合使用,例如$addToSet. 如果您想$set与其他集合运算符混合,那么您可以明确:

val update = $set("uDate" -> new DateTime) ++ 
             $addToSet("appearsOn" -> sourceToAppend, 
                       "hasElements" -> elementsToAppend, 
                       "hasTriples" -> triplesToAppend)

您不能$set“_id”,但因为那在查询中并且它是一个 upsert - 它会合并所以不要将它包含在更新语句中 - 否则它会出错。

最后,如果您不需要返回的文档,@AsyaKamsky 是正确的 - 使用update它也是原子的。

于 2013-06-12T09:47:32.293 回答