MongoDB:更改文档结构查询

时间:2012-07-05 18:21:32

标签: mongodb data-modeling

我们对数据模型进行了更改,并希望将其应用于我们的一个集合中的所有文档:

{
  "id":60,
  "measurement":{
    "steps":1274.0
  },
  "date":"2012-05-15T00:00:00Z"
}

为:

{  
  "id":60,
  "measurement":{
      "distance":{
          "steps":1274.0}
      },
  "date":"2012-05-15T00:00:00Z"
}

基本上,我们希望进一步嵌套字段steps,将其置于distance字段下。

至于measurement.step,我们希望将measurement.miles转换为measurement.distance.miles,将measurement.minutes转换为measurement.time.minutes

任何想法和/或建议都将不胜感激。

1 个答案:

答案 0 :(得分:4)

假设您正在询问如何编写架构更改的脚本,这在问题中并不十分清楚:我会做这样的事情,除非您有更多的文档结构案例或混合案例:

// find all the measurement documents with steps
db.coll.find({"measurement.steps":{$exists:true}}).forEach(function(doc) {      
  // create a new distance subdoc with the steps
  doc.measurement.distance = {steps:doc.measurement.steps};
  // delete the old steps subdoc
  delete doc.measurement.steps;
  // save the document
  db.coll.save(doc);
});
// find all the measurement documents with miles
db.coll.find({"measurement.miles":{$exists:true}}).forEach(function(doc) {
  // create a new distance subdoc with the miles
  doc.measurement.distance = {miles:doc.measurement.miles};
  delete doc.measurement.miles;
  db.coll.save(doc);
});
// find all the measurement documents with minutes
db.coll.find({"measurement.minutes":{$exists:true}}).forEach(function(doc) {
  // create a new time subdoc with the minutes
  doc.measurement.time = {minutes:doc.measurement.minutes};
  delete doc.measurement.minutes;
  db.coll.save(doc);
});

您可以很容易地在您选择的语言/驱动程序中执行等效操作以确保类型,但在shell中执行操作可能会更快。希望它有所帮助。