我是mongodb的新手,所以请耐心等待。
根据标题,我想实现的是将文档数组中所有文档中的特定字段从String转换为Int。我该怎么做?
示例文档:
{
reviews:[
{
snid:"1242"
},
{
snid:"8392"
}
]
}
我的目标是将所有snid从String转换为Int32
到目前为止,我知道我们可以使用类似db.collection.update()
的东西,但这将更新特定的字段,而不是数组。
另一种尝试是
db.collection.find({},{reviews:1,_id:0},(err,doc)=>{
//How do i push it back to the document
})
但正如您所知,我不完全确定我们应该如何将更新后的文档推回到相同的排序数组中。
任何见解都将不胜感激!
1(如果您使用的是MongoDB版本>=4.2
,请尝试以下查询:
db.collection.update({'reviews.snid' : {$exists : true}}, [
{
$set: {
reviews: {
$map: { input: "$reviews", in: { 'snid': { $toInt: "$$this.snid" } } }
}
}
}
],{multi :true})
以上查询使用.update()
中的聚合管道,该管道在版本4.2
中引入,您也可以使用.updateMany()
而不是.update()
。
它适用于以下类型的文档:
/* 1 */
{
"_id" : ObjectId("5e810f5ec16b5679b43a2f0e"),
"reviews" : [
{
"snid" : '1242'
},
{
"snid" : '8392'
}
]
}
/* 2 */
{
"_id" : ObjectId("5e810f6ac16b5679b43a310c"),
"reviews" : [
{
"snid" : '1242232'
},
{
"snid" : '8391232'
}
]
}
/* 3 */
{
"_id" : ObjectId("5e8110b1c16b5679b43a5148"),
"abc" : 1
}
/* 4 */
{
"_id" : ObjectId("5e8110c3c16b5679b43a52f9"),
"reviews" : []
}
/* 5 */
{
"_id" : ObjectId("5e811359c16b5679b43a9229"),
"reviews" : [
{
"abc" : "1"
}
]
}
但如果您有下面这样的文档,上述更新查询将部分工作:
{
"_id" : ObjectId("5e811359c16b5679b43a9230"),
"reviews" : [
{
"abc" : "1"
},
{
"snid" : "123"
}
]
}
在这种情况下,您需要使用$cond在$map
中进行条件检查,以查看当前对象是否具有键snid,然后转换值,或者将相同的对象原样传递给"reviews"数组。
2( 以防万一,如果您的MongoDB版本是<4.2
/4.0
&>3.2
-您可以使用.blkWrite((:
因为您不能在update&也是$toInt。所以你需要做.find()
来获得完整的文档&编写代码将这些字符串转换为整数&使用.bulkWrite()
在一次更新DB调用中更新文档(可以将_id
作为每个文档的密钥(。
3( 您还可以对现有集合&使用$out更新整个集合,或者只运行一个查询将聚合结果写入新集合。我更愿意暂时将其写入新的集合,以检查数据是否正确&通过用以_backup
作为备份结尾的东西命名现有集合,将新集合重命名为曾经存在的集合。