updateMany基于mongodb的其他字段。

问题描述 投票:0回答:1

我有两份文件

/* 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的实例。

最后的结果是这样的。enter image description here

由于某种原因,值被设置为明文。

我使用的是Mongodb 4.2.6mongo-java-driver 3.9.0。

问题:如何使用java代码来设置这个字段?

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

  2. 为什么结果不一样。我还以为mongdb里有什么共同的引擎来执行。而这是完全相同的查询。

mongodb mongo-java mongo-java-driver
1个回答
0
投票

您的更新使用的是 MongoDB v4.2 的特点 管道式更新. 你可以使用以下代码 MongoDB Java 驱动程序 v3.11 或更高. 使用其他字段的值更新字段。

Bson query = new Document();
List<Bson> updatePipeline = Arrays.asList(Fiters.eq("$set", Filters.eq("byMongoQuery", "$lastUpdated")));
UpdateResult result = collection.updateMany(query, updatePipeline);
© www.soinside.com 2019 - 2024. All rights reserved.