【问题标题】:MongoDB move element of sub-document to another sub-documentMongoDB将子文档的元素移动到另一个子文档
【发布时间】:2018-07-29 15:31:35
【问题描述】:

我需要更改我的架构

const dataSchema = new Schema({
  trackingPrice: [{
    timeCheck: { type: Date, default: Date.now },
    lowestPrice: Number,
    salePrice: Number,
    saleRank: Number
  }]
})

到这里

const dataSchema = new Schema({
  trackingPrice: [{
    timeCheck: { type: Date, default: Date.now },
    lowestPrice: Number,
    salePrice: Number
  }],
  trackingRank: [{
    timeCheck: { type: Date, default: Date.now },
    saleRank: Number
  }]
})

如何在文档下将我的数据从一个转移到另一个,然后删除“saleRank”?

【问题讨论】:

  • 取决于此数据是否在生产中且变化率很高。如果不只是找到记录并操作数组并保存文档。如果使用 mongo 的 $set、$push 等事务性命令更好?

标签: javascript node.js mongodb mongoose aggregation-framework


【解决方案1】:

我看到的最好的方法是找到所有这些,并为每个创建一个新的

顺便说一句,我正在使用猫鼬

    dataSchema.find({}, (err,all) => {
          var array = [];
          all.foreach( (ds) => {
            array.push({
              trackingPrice: ds.trackingPrice,
              trackingRank: //whatever way you want to update the old data
           })
           dataSchema.remove({}).exec(() => {
             array.foreach((a) => {
               var toadd = new dataSchema({
                   trackingPrice:a.trackingPrice,
                   trackingRank:a.trackingRank});
               toadd.save();                     
             })             
          })
       })}
    ); 

【讨论】:

    【解决方案2】:

    基于此 very good answer,您的情况下的光标将来自运行聚合管道:

    const pipeline = [
        {
            "$project": {
                "trackingPrice": {
                    "$map": {
                        "input": "$trackingPrice",
                        "as": "el",
                        "in": { 
                            "timeCheck": "$$el.timeCheck",
                            "lowestPrice": "$$el.timeCheck",
                            "salePrice": "$$el.salePrice"
                        }
                    }
                },
                "trackingRank": {
                    "$map": {
                        "input": "$trackingPrice",
                        "as": "el",
                        "in": { 
                            "timeCheck": "$$el.timeCheck",
                            "saleRank": "$$el.saleRank"
                        }
                    }
                }
            }
        }
    ];
    
    const cursor = Data.aggregate(pipeline).exec();
    

    运行批量更新:

    let bulkUpdateOps = [];
    
    cursor.then(results => {
        results.forEach(doc => {
            const { _id, trackingPrice, trackingRank } = doc;
            bulkUpdateOps.push({
                "updateOne": {
                   "filter": { _id },
                   "update": { "$set": { trackingPrice, trackingRank } },
                   "upsert": true
                }
            });
        }); 
    
        if (bulkUpdateOps.length === 1000) {
            bulkUpdateOps = [];
            return Data.bulkWrite(bulkUpdateOps);           
        }       
    
    }).then(console.log).catch(console.error);
    
    if (bulkUpdateOps.length > 0) {
        Data.bulkWrite(bulkUpdateOps).then(console.log).catch(console.error);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2012-11-22
      • 2017-05-13
      • 2015-01-18
      相关资源
      最近更新 更多