如何将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); }); 

有三件事需要关注:

  1. parseInt()将在mongodb中存储double数据types。 请使用新的NumberInt(string)。
  2. 在Mongo shell命令中进行批量使用,yield不会奏效。 请不要添加“收益”。
  3. 如果您已经将string更改为parseInt()的两倍。 它看起来像你没有办法直接改变types为int。 解决方法是有点线:先改变stringdouble,然后通过新的NumberInt()返回int。

它应该被保存。 应该是这样的:

  db. my_collection.find({}).forEach(function(theCollection) { theCollection.moop = parseInt(theCollection.moop); db.my_collection.save(theCollection); });