如何更改mongodb数组值的数据类型?
具有下列文件:如何更改mongodb数组值的数据类型?,mongodb,types,mongodb-query,Mongodb,Types,Mongodb Query,具有下列文件: { "_id" : 1.0000000000000000, "l" : [ 114770288670819.0000000000000000, NumberLong(10150097174480584) ]} 如何将“l”数组的第二个元素从NumberLong转换为平坦点(double),例如第一个元素 在mongo shell中加载文档 var doc=db.collection.find({u id:1.0000000000000000}) 使用pars
{
"_id" : 1.0000000000000000,
"l" : [
114770288670819.0000000000000000,
NumberLong(10150097174480584)
]}
如何将“l”数组的第二个元素从NumberLong转换为平坦点(double),例如第一个元素
var doc=db.collection.find({u id:1.0000000000000000})代码>
parseFloat
函数将字段显式转换为浮点数:
doc.l[1]=parseFloat(doc.l[1])代码>
db.collection.save(单据)代码>
要更新此值,您应该使用编程语言代码或一些使用java脚本的变通方法 其他明智的做法是使用
聚合
,在新集合中编写文档,如下所示:
db.collectionName.aggregate({
"$unwind": "$l"
}, {
"$project": {
"l1": {
"$divide": ["$l", 1] // divide by one or multiply by one
}
}
}, {
"$group": {
"_id": "$_id"
, "l": {
"$push": "$l1"
}
}
}, {
"$out": "newCollectionName" // write data in new collection
})
如果完成上述查询,则删除旧集合并使用此新集合 另外,由于其他响应在执行中非常模糊,或者建议编写新集合或其他“不安全”操作,因此我认为您应该遵循的响应是正确的 当您考虑到诸如“保持元素的顺序”和“不可能覆盖文档的其他更改”之类的所有考虑因素时,这并不是一个要解决的简单问题(尽管其他人不这么认为),这些都是生产系统中的重要考虑因素 我能看到的唯一真正“安全(ish)”的方法是使用这样的构造(用于提高效率),它不可能(主要)吹走整个阵列并丢失任何“活动”写入:
var bulk=db.collection.initializeOrderedBulkOp(),
计数=0;
db.collection.find({“l”:{“$type”:18}).forEach(函数(doc){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$pull”:{“l”:{“$in”:doc.l}
});
计数++;
如果(计数%1000==0){
bulk.execute();
bulk=db.collection.initializeOrderedBulkOp();
}
doc.l.map(函数(l,idx){
返回{“l”:parseFloat(l.valueOf()),“idx”:idx}
}).forEach(函数(l){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$push”:{“l”:{“$each”:[l.l],“$position”:l.idx}
});
计数++;
如果(计数%1000==0){
bulk.execute();
bulk=db.collection.initializeOrderedBulkOp();
}
});
});
如果(计数%1000!=0)
bulk.execute();
这意味着在需要时“批量”重写整个集合中的数据,但在单个样本上,结果是:
{u id:1,“l”:[114770288670811910150097174480584]}
因此,基本原理是,这将在您的集合中找到与当前匹配的NumberLong
(BSON类型中为64位整数)文档,并按以下方式处理结果