【问题标题】:updateMany based on other field in mongodbupdateMany 基于 mongodb 中的其他字段
【发布时间】: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

问题:

  1. 如何使用 java 代码设置此字段。我更喜欢 updateMany,因为有很多这样的记录

  2. 为什么结果不同。我期待在 mongdb 中有一些通用引擎来执行它。这是完全相同的查询。

【问题讨论】:

  • 可能很笨,但是您是否尝试过删除 ' $lastUpdated ' 周围的单引号?
  • 删除单引号会导致语法错误org.bson.json.JsonParseException: JSON reader was expecting a value but found '$lastUpdated'.
  • 您在 update 语句(从工具运行)中使用了聚合管道。 MongoDB Java 代码不是(这就是为什么将值设置为“明文”的原因)。

标签: mongodb mongo-java mongo-java-driver


【解决方案1】:

您的更新使用updating using a pipelineMongoDB v4.2 功能。您可以使用 MongoDB Java Driver v3.11 或更高版本对此进行编码。使用另一个字段的值更新一个字段:

Bson query = new Document();
List<Bson> updatePipeline = Arrays.asList(Fiters.eq("$set", Filters.eq("byMongoQuery", "$lastUpdated")));
UpdateResult result = collection.updateMany(query, updatePipeline);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2020-09-20
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多