MongoDb查询将字符串数组更新为对象数组

时间:2018-02-08 07:41:21

标签: mongodb

您好,我是第一次在这里发帖。我也是mongodb的新手。我在谷歌搜索但我没有找到答案。目前在我的收藏中我有一个字符串列表

"keepOuts" : [
        "198,168,282,115,292,180", 
        "356,120,466,192,330,252,346,186"
    ]

我需要一个mongo db查询,它将更新我的集合中的所有文档,例如

"keepOuts" : [
       {
           "coordinates" : "126,200,166,185,158,236", 
           "height" : NumberInt(0)
       }, 
       {
           "coordinates" : "146,141,169,107,192,154", 
           "height" : NumberInt(0)
       }
   ],

这里对于旧的keepOuts中的每个条目,每个对象都被创建,它将进入键坐标,另外的字段也被设置到具有键高度的同一个对象中。高度默认为0。

我从这个门户获得了查询,它为我提供了拆分数组,但它没有更新集合。查询是

db.quoteDetails1.aggregate([
  {"$match":{keepOuts:{ $exists: true}}},
  {"$unwind": {path : "$keepOuts"}},
  {
    $group: {"_id": "$_id", 
    result:{
      $push:{
      coordinates:"$keepOuts"}}}}])

谢谢大家。

2 个答案:

答案 0 :(得分:0)

试试这个!

db.quoteDetails1.find({}).toArray().forEach(
function (elem) {
        for(var i = 0; i < elem.keepOuts.length; ++i) { 
            var obj = {"coordinates" : elem.keepOuts[i], "height": NumberInt(0)}
            elem.keepOuts[i] = obj
        }
        db.quoteDetails1.update({_id: elem._id}, elem);

});

答案 1 :(得分:0)

我通过以下javascript获得了答案

    db.getCollection('quoteDetails').find({keepOuts:{"$exists":true}}).forEach(
    function(doc) {    
      if(doc.keepOuts.length > 0){
        var array = doc.keepOuts;

        if(typeof array[0] === "string"){
            db.quoteDetails.update({"_id":doc._id},{"$set":{keepOuts :
            arrayToObj(doc)              
            }});
        }
      }
    }
);

function arrayToObj(doc){
    print("processing for" + doc._id);
    var array = doc.keepOuts;
    var len = array.length;
    var outerArray =[];

  for(var i = 0; i<len; i++){
    var obj = {};
    var curVal = array[i];
    obj["coordinates"]=curVal;
    obj["height"]=0; 
    outerArray.push(obj);
  }
  return outerArray;
}