0

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

{
  "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"
}

本质上,我们想进一步嵌套 field steps,将它放在distancefield 之下。

至于measurement.step,我们想转换measurement.milesmeasurement.distance.miles和。measurement.minutesmeasurement.time.minutes

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

4

1 回答 1

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 中执行此操作可能更快。希望能帮助到你。

于 2012-07-05T19:33:12.503 回答