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