updateMany 使用 Java 在 mongoDB 中进行类型更改

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

我有一个用例来更新平均大小为 250kb 的 mongoDB 集合中的数据。 用例:将字段版本的数据类型从 String 转换为 Long。

我想以有效的方式做到这一点。从 Java 以及直接 mongo 查询寻找选项。

MongoQuery 发现:

db.collection.updateMany({version : {$type: "string"}}, {$set: {version: {$toLong: "$version"}}})

在java中尝试下面类似的方法,但没有找到版本。

Bson filter = new Document("version", new Document("$type", "string"));
Bson newValue = new Document("version", *****);
Bson updateOperationDocument = new Document("$set", newValue);
collection.updateMany(filter, updateOperationDocument);

如何实现这一点,没有找到正确的方法。

java mongodb mongodb-query updates
1个回答
0
投票

我不太清楚你的问题的严重程度。但您确实提到您正在寻找要实现的直接 MongoDB 查询,并且您共享的查询中存在错误,因此这就是本答案将重点关注的内容。

正如我们在这个游乐场示例中看到的,更新实际上并没有达到预期目的。它向我们展示了如下文件:

  {
    _id: 2,
    version: "123"
  },

修改如下:

  {
    "_id": 2,
    "version": {
      "$toLong": "$version"
    }
  },

version
{ "$toLong": "$version" }
的字面翻译与当前编写的命令的语义有关。正如这个答案中所述,MongoDB 中实际上有两个不同的
$set
运算符。您当前正在使用更新修饰符,但由于您引用了另一个字段,因此您将需要使用聚合阶段。

好消息是转换非常简单,只需将命令的第二个参数括在方括号中即可。在这种情况下,我们想将其更改为:

db.collection.updateMany(
  {version : {$type: "string"}}, 
  {$set: {version: {$toLong: "$version"}}}
)

致:

db.collection.updateMany(
  {version : {$type: "string"}}, 
  [ {$set: {version: {$toLong: "$version"}}} ]
)

这种替代语法会对我们之前查看的示例文档产生以下更改:

  {
    "_id": 2,
    "version": NumberLong(123)
  },

看看它是如何工作的这个其他游乐场示例

© www.soinside.com 2019 - 2024. All rights reserved.