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

时间:2015-07-16 16:16:58

标签: mongodb mongodb-query

我需要进行更改以使用生成的ObjectId而不是我正在使用的String,但字段数据类型从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 = NumberInt(item.count)以确保它是一个Int但是 我真的不想为我所拥有的每个领域都这样做。

无论如何都不需要手动转换它们吗?我不明白为什么它需要一个Int并把它变成一个Double。我知道Double是默认值,但我使用的字段已经是Integers。

1 个答案:

答案 0 :(得分:0)

如果我理解你,你的文件就像这样:

{ "_id" : "Apple", "count" : 187 }
{ "_id" : "Google", "count" : 123 }
{ "_id" : "Amazon", "count" : 325 }
{ "_id" : "Oracle", "count" : 566 }

您可以使用Bulk Api 更新您的收藏。

var bulk = db.collection.initializeUnorderedBulkOp();
Var count = 0;

db.collection.aggregate([{ $project: { '_id': 0, 'name': '$_id', 'count': 1 }}]).forEach(function(doc){
    bulk.find({'_id': doc.name}).remove(); 
    bulk.insert(doc); 
    count++; 
    if (count % 1000 == 0){
        // Execute per 1000 operations and re-init.
        bulk.execute(); 
        bulk = db.collection.initializeUnorderedBulkOp(); 
    }})

// Clean up queues
if (count % 1000 != 0){ 
    bulk.execute(); 
} 

然后:

db.collection.find()                                                        

产生以下文件:

{ "_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是默认值,但我使用的字段已经是Integers。

如果你正在使用shell,你真的不必担心,但正如评论中指出的那样,你总是可以使用一种原生支持整数的语言来保存数据类型。