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

tyky79it  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(103)

我有一个用例来更新mongoDB集合中的数据,平均大小为250kb。用例:将字段版本的数据类型从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);

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

gopyfrb3

gopyfrb31#

我不太清楚你问题的范围。但是你提到你正在寻找直接的MongoDB查询来实现,并且在你分享的那个查询中有一个错误,所以这就是这个答案的重点。
正如我们在this playground example中看到的,更新实际上并没有完成预期的任务。它向我们展示了以下文件:

{
    _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)
  },

了解它在this other playground example中的工作原理

相关问题