如何将string转换为mongodb中的数值
我试图将包含数值的string转换为在MongoDB中的聚合查询中的值。
文件的例子
{ "_id": ObjectId("5522XXXXXXXXXXXX"), "Date": "2015-04-05", "PartnerID": "123456", "moop": "1234" }
我使用的聚合查询的示例
{ aggregate: 'my_collection', pipeline: [ {$match: { Date : {$gt:'2015-04-01', $lt: '2015-04-05' }} }, {$group: {_id: "$PartnerID", total:{$sum:'$moop'} }}]}
结果在哪里
{ "result": [ { "_id": "123456", "total": NumberInt(0) } }
如何将string转换为数字值?
MongoDB聚合不允许改变给定字段的现有数据types。 在这种情况下,您应该创build一些编程代码将string
转换为int
。 检查下面的代码
db.collectionName.find().forEach(function(data) { db.collectionName.update({ "_id": data._id, "moop": data.moop }, { "$set": { "PartnerID": parseInt(data.PartnerID) } }); })
如果你的集合体积大于上面那么脚本会减慢性能,对于mongo提供的mongo批量操作,使用mongo批量操作也会更新数据types
var bulk = db.collectionName.initializeOrderedBulkOp(); var counter = 0; db.collectionName.find().forEach(function(data) { var updoc = { "$set": {} }; var myKey = "PartnerID"; updoc["$set"][myKey] = parseInt(data.PartnerID); // queue the update bulk.find({ "_id": data._id }).update(updoc); counter++; // Drain and re-initialize every 1000 update statements if (counter % 1000 == 0) { bulk.execute(); bulk = db.collectionName.initializeOrderedBulkOp(); } }) // Add the rest in the queue if (counter % 1000 != 0) bulk.execute();
这基本上减less了发送到服务器的操作语句数量,每1000个排队操作只发送一次。
最终我用了
db.my_collection.find({moop : {$exists : true}}).forEach( function(obj) { obj.moop = new NumberInt( obj.moop ); db.my_collection.save(obj); } );
将moop
从string转换为my_collection中的整数后面的例子在Simone的答案MongoDB:如何更改字段的types? 。
You can easily convert the string data type to numerical data type. Don't forget to change collectionName & FieldName. for ex : CollectionNmae : Users & FieldName : Contactno.
试试这个查询
db.collectionName.find().forEach( function (x) { x.FieldName = parseInt(x.FieldName); db.collectionName.save(x); });
有三件事需要关注:
- parseInt()将在mongodb中存储double数据types。 请使用新的NumberInt(string)。
- 在Mongo shell命令中进行批量使用,yield不会奏效。 请不要添加“收益”。
- 如果您已经将string更改为parseInt()的两倍。 它看起来像你没有办法直接改变types为int。 解决方法是有点线:先改变stringdouble,然后通过新的NumberInt()返回int。
它应该被保存。 应该是这样的:
db. my_collection.find({}).forEach(function(theCollection) { theCollection.moop = parseInt(theCollection.moop); db.my_collection.save(theCollection); });