Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Casbah中执行MongoDB findAndModify查询,包括$addToSet_Mongodb_Scala_Casbah - Fatal编程技术网

在Casbah中执行MongoDB findAndModify查询,包括$addToSet

在Casbah中执行MongoDB findAndModify查询,包括$addToSet,mongodb,scala,casbah,Mongodb,Scala,Casbah,我对scala和cashbah都是新手。我正在努力 如果存在,则更新文档(通过_id),如果不存在,则创建文档 更新时,更新一些键值 更新时,更新一些值为集合的键,并将一些数据包含到这些集合中 为了实现这一点,我写了以下内容: DBObject = MongoDBObject("_id" -> uri.toString) ++ $addToSet("appearsOn" -> sourceToAppend) ++ $addToSet("hasElement

我对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
    )
通过
\u id
查看文档,添加到
中的一些新项目将出现
hasElements
hasTriples
uDate
被更新

sourceToAppend
elementsToAppend
triplesToAppend
List[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认为它是字段?我做错了什么?

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

$set
对于更新文档中的值是隐式的,但不能将其与其他更新运算符(例如
$addToSet
)混合使用。如果要将
$set
与其他set运算符混合使用,则可以在明确的情况下:

val update = $set("uDate" -> new DateTime) ++ 
             $addToSet("appearsOn" -> sourceToAppend, 
                       "hasElements" -> elementsToAppend, 
                       "hasTriples" -> triplesToAppend)
您不能
$set
“\id”,但因为它在查询中,并且是一个upsert-它将合并,所以不要将它包含在update语句中-否则它将出错


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

为什么您使用findAndModify而不是更新操作?@AsyaKamsky我希望它是原子操作。更新是原子的。findAndMofidy实际上是更新和返回文档。