0

データ モデルに変更を加え、コレクションの 1 つのすべてのドキュメントに適用したいと考えています。

{
  "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.milesmeasurement.distance.milesmeasurement.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);
});

型を確保するために、選択した言語/ドライバーで同等のことを簡単に行うことができますが、シェルで行う方がおそらく高速です。それが役に立てば幸い。

于 2012-07-05T19:33:12.503 に答える