【发布时间】:2020-06-05 09:55:57
【问题描述】:
我有两个文件
/* 1 */
{
"lastUpdated" : ISODate("2019-01-01T01:01:20.201Z"),
"content" : "someText01",
}
/* 2 */
{
"lastUpdated" : ISODate("2020-11-11T16:11:20.202Z"),
"content" : "someText02",
}
现在我想更新文档 - 创建新字段作为 lastUpdated 字段的副本;
在 robo3T 中我可以做这样的事情
db.getCollection('someDocuments').update({},
[
{"$set": {"byMongoQuery": "$lastUpdated", }}
],
{"multi": true}
)
而且它有效。 现在我想用java代码做同样的事情(mongo-java-driver 3.9.0) 我会做类似的事情
mongodb.getCollection("someDocuments").updateMany(Document.parse("{}"), Document.parse("{$set: {'byJavaApi': '$lastUpdated'}}"))
mongodb 是 com.mongodb.client.MongoDatabase 的实例
由于某种原因,值被设置为明文。
我正在使用 MongoDB 4.2.6 mongo-java-driver 3.9.0
问题:
如何使用 java 代码设置此字段。我更喜欢 updateMany,因为有很多这样的记录
为什么结果不同。我期待在 mongdb 中有一些通用引擎来执行它。这是完全相同的查询。
【问题讨论】:
-
可能很笨,但是您是否尝试过删除 ' $lastUpdated ' 周围的单引号?
-
删除单引号会导致语法错误
org.bson.json.JsonParseException: JSON reader was expecting a value but found '$lastUpdated'. -
您在 update 语句(从工具运行)中使用了聚合管道。 MongoDB Java 代码不是(这就是为什么将值设置为“明文”的原因)。
标签: mongodb mongo-java mongo-java-driver