我需要进行更改以使用生成的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。
答案 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,你真的不必担心,但正如评论中指出的那样,你总是可以使用一种原生支持整数的语言来保存数据类型。