2017-06-12 3 views
1

シェル私は暫定コーディング段階でprintjsonを使用してMongoDBのクエリをデバッグしようとしています。私は中間段階として異なる構造を備えた3つのコレクションから同様のprintjson出力を達成することができました。私は、これは私がすべての3つの異なるコレクションのために、この時点から、共通のコードを使用することができます思いました。しかし、これは動作していないように見えました。期待どおりに、2つのコレクションは、行儀が、第三は、(Object.keys関数を使用して)、次の符号化ステップではなかったです。私は3つの質問があります:のMongoDBデバッグ

  1. printjsonはデバッグに適したツールですか?
  2. なぜ類似printjson出力のコードは、中間ステップとして、後続の符号化ステップで異なる動作をしますか?
  3. どのように私はlayouts1layouts2で生成したのと同様の結果を生成するためにlayouts3にクエリコードを修正することができますか?

三つの異なるコレクションは、以下のとおりです。layouts1layouts2、およびlayouts3:以下

db.layouts1.insert({ 
    "_id": ObjectId("58e574a768afb6085ec3a388"), 
    "positions": [{ 
      "_id":  ObjectId("58e55f0f68afb6085ec3a2cc"), 
      "cyan" : [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2d0")}], 
      "magenta": [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2cd")}], 
      "yellow": [{"unit": "08","side": "3","_id": ObjectId("58e55f0f68afb6085ec3a2ce")}], 
      "black": [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2cf")}] 
     }] 
}); 

db.layouts2.insert({ 
    "_id" : ObjectId("58e574a768afb6085ec3a388"), 
    "pages" : [{ 
      "_id"  : ObjectId("58e542fb68afb6085ec3a1d2"), 
      "positions" : [ 
         {"cyan":  [{ "unit" : "08", "side" : "5","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d6")}]}, 
         {"magenta": [{"unit" : "08","side" : "5","position" : "Drive Side Far","_id" : ObjectId("58e542fb68afb6085ec3a1d3")}]}, 
         {"yellow": [{"unit" : "08","side" : "3","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d4")}]}, 
         {"black": [{"unit" : "08","side" : "5","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d5")}]} 
          ] 
         }] 
      }); 

db.layouts3.insert({ 
    "_id":    ObjectId("58e574a768afb6085ec3a388"), 
    "pages": [{ 
     "_id":   ObjectId("58e542fb68afb6085ec3a1d2"), 
     "positions": [{ "_id": ObjectId("58e55f0f68afb6085ec3a2cc"), 
      "cyan":  [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2d0") }], 
      "magenta": [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2cd") }], 
      "yellow": [{ "unit": "08", "side": "3", "_id": ObjectId("58e55f0f68afb6085ec3a2ce") }], 
      "black": [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2cf") }] 
     }]}]}); 

printjson出力を見ることで判断されるように、同様のデータ構造を有するように見える出力を得るために必要なコードです、 3つのコレクションのそれぞれについて以下は

db.layouts1.find().forEach(doc => { doc.positions = doc.positions 
    .map(position => { Object.keys(position) // Returns a new array conaining all keys for positions 
     .filter(positionKey => positionKey !== "_id") // Returns a new array without _id 
     .forEach(positionKey => { printjson(position[positionKey])})})}) 

db.layouts2.find().forEach(doc => { doc.pages = doc.pages 
.map(page => { page.positions 
    .forEach(position => { Object.keys(position) 
     .forEach(positionKey => {printjson(position[positionKey])})})})}) 


db.layouts3.find().forEach(doc => { doc.pages = doc.pages 
    .map(page => { page.positions // page.positions mapped and is [] 
     .forEach(position => { Object.keys(position) // returns one array with _id, cyan, magenta, etc. 
      .forEach(positionKey => { printjson(position[positionKey])})})})}) 

layouts1layouts2のために働くのコードですが、layouts3のためにしません:

db.layouts1.find().forEach(doc => { doc.positions = doc.positions 
    .map(position => { Object.keys(position) // Returns a new array conaining all keys for positions 
     .filter(positionKey => positionKey !== "_id") // Returns a new array without _id 
     .forEach(positionKey => { position[positionKey] 
      .forEach(colorDetails => { printjson(Object.keys(colorDetails)) 
      })})})}) 

db.layouts2.find().forEach(doc => { doc.pages = doc.pages 
.map(page => { page.positions 
    .forEach(position => { Object.keys(position) 
     .forEach(positionKey => {position[positionKey] 
     .forEach(colorDetails => { printjson(Object.keys(colorDetails))}) }) })})}) 

FOLLOWINGは動作しません。それは次のエラーを生成します。TypeError: position[positionKey].forEach is not a function

db.layouts3.find().forEach(doc => { doc.pages = doc.pages 
    .map(page => { page.positions // page.positions mapped and is [] 
     .forEach(position => {Object.keys(position) 
      .forEach(positionKey => { position[positionKey] 
       .forEach(colorDetails => { printjson(Object.keys(colorDetails)) 
       })})})})}) 

答えて

1
  1. printjsonは、デバッグのための良いツールのように見える、それは私が実際にコードを少し持っている問題
  2. を特定し、困難な、printjson出力に気づくのを助けました。動作しませんでしたコードは、出力
  3. layouts1とlayouts2で生成したのと同様の結果を生成するために必要なコードの上にObjectId("58e55f0f68afb6085ec3a2cc")を持っていた、次のとおりです。

    db.layouts3.find().forEach(doc => { doc.pages = doc.pages .map(page => { page.positions // page.positions mapped and is [] .forEach(position => {Object.keys(position) // Filter the "_id" field which is needed to remove the "_id" field .filter(positionKey => positionKey !== "_id") .forEach(positionKey => { position[positionKey] .forEach(colorDetails => { printjson(Object.keys(colorDetails)) })})})})})