Mongodb 复制文档时如何维护数据类型?

Mongodb 复制文档时如何维护数据类型?,mongodb,mongodb-query,Mongodb,Mongodb Query,我需要更改以使用生成的ObjectId,而不是我使用的字符串,但是字段数据类型从Int更改为Double 例如,假设我们有一个文档 {_id: "Product Name", count: 415 } 现在我想创建一个文档 {_id: "some object id", name: "Product Name", count: 415 } 我正在使用下面类似的代码,但它使计数加倍 var cursor = db.products.find() cursor.forEach(function(

我需要更改以使用生成的ObjectId,而不是我使用的字符串,但是字段数据类型从Int更改为Double

例如,假设我们有一个文档

{_id: "Product Name", count: 415 }
现在我想创建一个文档

{_id: "some object id", name: "Product Name", count: 415 }
我正在使用下面类似的代码,但它使计数加倍

var cursor = db.products.find()
cursor.forEach(function(item) 
{
    var old_id= item._id;

    item.name = old_id;
    delete item._id; 

    db.products.insert(item); 
    db.products.remove({_id:old_id}); 
});
我可以将它添加到循环中:item.count=numberprint(item.count)以确保它是Int,但 我真的不想对我拥有的每个领域都这样做


是否可以在不手动强制转换的情况下执行此操作?我不明白为什么它需要一个Int,然后把它变成一个Double。我知道Double是默认值,但我正在使用的字段已经是整数了。

如果我理解您的意思,您的文档如下所示:

{u id:“苹果”,“计数”:187}
{u id:“谷歌”,“计数”:123}
{u id:“亚马逊”,“计数”:325}
{u id:“甲骨文”,“计数”:566}
您可以使用更新集合

var bulk=db.collection.initializeUnderedBulkop();
Var计数=0;
collection.aggregate([{$project:{''u id':0,'name':'$'u id','count':1}}]).forEach(函数(doc){
bulk.find({''u id':doc.name}).remove();
批量插入(doc);
计数++;
如果(计数%1000==0){
//每1000次操作执行一次并重新初始化。
bulk.execute();
bulk=db.collection.initializeUnderedBulkop();
}})
//清理队列
如果(计数%1000!=0){
bulk.execute();
} 
然后:

产生以下文件:

{“_id”:ObjectId(“55a7e2c7eb68594275546c7c”),“count”:187,“name”:“Apple”}
{“_id”:ObjectId(“55a7e2c7eb68594275546c7d”),“count”:123,“name”:“Google”}
{“_id”:ObjectId(“55a7e2c7eb68594275546c7e”),“count”:325,“name”:“Amazon”}
{“_id”:ObjectId(“55a7e2c7eb68594275546c7f”),“count”:566,“name”:“Oracle”}

是否可以在不手动强制转换的情况下执行此操作?我不明白为什么它需要一个Int,然后把它变成一个Double。我知道Double是默认值,但是我使用的字段已经是整数了


如果您使用的是shell,您真的不必担心这个问题,但正如注释中所指出的,您可以始终使用一种本机支持整数的语言来保留数据类型。

我编写了一个快速java类来做同样的事情,但速度要慢得多。@KarenS。是的,使用本机支持整数的语言是保存数据类型的方法。使用来自Java的批量API来提高性能。“我不明白为什么它接受Int并将其转换为Double。”-因为javascript中没有整数。啊,好的,这就解释了。感谢您的回复!
db.collection.find()