2017-09-18 6 views
0

私はシソーラスアプリを構築していますが、この質問のために、私は同義語(同じ意味を持つ単語)のリストを追加しています"プログラム"配列をオブジェクトの配列プロパティにプッシュ

"synonyms"というプロパティを持つWordオブジェクトがあります。これは配列です。 シノニムの配列をWordのシノニムプロパティに追加します。 はMongoDBのドキュメントsee hereによると、一度に文書の配列プロパティに配列のすべてのインデックスを追加する唯一の方法は、以下試してみることです。

db.students.update(
    { _id: 5 }, 
    { 
    $push: { 
     quizzes: { 
      $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ], 
     } 
    } 
    } 
) 

レッツ・再書き込み私のデータを合わせて、そのソリューションを、私たちがさらにベンチャーになる前に。

db.words.update(
     { baseWord: 'cat' }, 
     { 
     $push: { 
      synonyms: { 
       $each: [ { _id: 'someValue', synonym: 'feline' }, { _id: 'someValue', synonym: 'puss' }, { _id: 'someValue', synonym: 'tomcat' } ], 
      } 
     } 
     } 
    ) 

私は何をしようとしていません。

データを事前に把握せず、フィードを作成するダイナミックアレイがある場合はどうなりますか? 私の現在のソリューションはそうのようなWordオブジェクトの同義語の配列プロパティに追加された配列で、その結果、配列を分割してのforEach()ループを実行することです:

//req.body.synonym = 'feline,tomcat,puss'; 
var individualSynonyms = req.body.synonym.split(','); 

individualSynonyms.forEach(function(synonym) { 

      db.words.update(        
       { "_id": 5 },      
       { $push: //this is the Word.synonyms 
        { synonyms: 
         { 
         $each:[{ //pushing each synonym as a Synonym object      
           uuid : uuid.v4(),          
           synonym:synonym,          
          }]         
         } 
        } 
       },{ upsert : true }, 
       function(err, result) { 
        if (err){ 
         res.json({ success:false, message:'Error adding base word and synonym, try again or come back later.' }); 
         console.log("Error updating word and synonym document"); 
        } 
        //using an 'else' clause here will flag a "multiple header" error due to multiple json messages being returned 
        //because of the forEach loop 
        /* 
        else{        
         res.json({ success:true, message:'Word and synonyms added!' }); 
         console.log("Update of Word document successful, check document list"); 
        } 
        */    
       }); 
       //if each insert happen, we reach here 
       if (!err){ 
        res.json({ success:true, message:'Word and synonyms added!.' }); 
        console.log("Update of Word document successful, check document list"); 
       }  
     }); 
}   
  • これは意図したとおりに動作しますが、あなた下部に、ELSE句がコメントアウトされている場所と、 'if(!err)'のチェックが表示されます。 ELSE句を実行すると、ループによって1回のリクエストで複数のJSON結果が発生するため、複数のヘッダーエラーが発生します。

「if(!err)」は.update()関数からのコールバックの 'err'パラメータのスコープを持たないため、エラーをスローします。 - forEachループの使用を避け、シノニムの配列を1回のupdate()呼び出しに直接フィードする方法があった場合、コールバック内でif(!err)を使用できます。

「if(!err)節を削除するだけですが、if、else、else if」のような最終的なエラーチェックを行わずにJSONレスポンスを送信するだけで汚れているようです

この特定のアプローチはドキュメントやこのサイトでは見つけられませんでした。応答を送信する前に最終的なエラーチェックを実行できるため、実行可能ならベストプラクティスのようです。 これが実際に実行できるかどうか不思議です。

私はコンソールを使用していませんが、読みやすいように各オブジェクトを呼び出す前に名前空間接頭辞を含めました。

+0

答えが出てこない1つのことがあります。可能なかどうかを知りたいのですが。それは非常に有用だったので、私は答えを受け入れるでしょう。 投稿された質問では、シノニム配列に投稿された各シノニムは、uuidプロパティとシノニムプロパティ(「Word」オブジェクトに追加する単語を表す)を受け取ります。 あなたのソリューションでは、追加されているこれらの同義語にはuuidがなくなりました。あなたの最後の投稿の後すぐに、それらのネストされたプロパティにuuidsを発行する必要はないことがわかりましたが、それが無関係にできるかどうか不思議です。 – OisinFoley

+0

Dude。私はあなたにuuidも追加していることを示しています。私は基本的に、あなたのコードが正しくありませんでしたすべてをしています。あなたは質問がある場合は、次に来て、彼らに尋ねる。数日間静かに座ってはいけません。 –

+0

Wordエントリのサンプル出力は、 {"_id":ObjectId( "59c2fae359bf1ed0fb70d83e")、 "uuid": "someValue"、 "baseWord": "aaa"、 "synonyms":[{"同義語": " {"_id":ObjectId( "59c2fae359bf1ed0fb70d83e"))というよりも、 "bbb"}、{"同義語": "ccc"}、{"同義語": "ddd"}、 "__v":0} "someValue": "someValue"、 "baseword": "aaa"、 "同義語":[{uuid: "someValue"、 "同義語": "bbb"}、{uuid: "someValue"、 "同義語": "ccc "}、{uuid:" someValue "、"同義語 ":" ddd "}]、" __v ":0} ちょうど好奇心旺盛であることと害虫Neilの間の適切なトレードオフを見出そうとしています。 – OisinFoley

答えて

1

$eachは引数として「配列」を取るため、「反復」する必要はありません。単に.map()追加データで.split()から生成配列:だから.split()あなたはuuid値の配列に.map()を使用して「変換」の文字列から、「アレイ」と要素から"synonym"を生成

db.words.update(        
    { "_id": 5 },      
    { $push: { 
    synonyms: { 
     $each: req.body.synonym.split(',').map(synonym => 
     ({ uuid: uuid.v4, synonym }) 
    ) 
    } 
    }}, 
    { upsert : true }, 
    function(err,result) { 
    if (!err){ 
     res.json({ success:true, message:'Word and synonyms added!.' }); 
     console.log("Update of Word document successful, check document list"); 
    }  
    } 
); 

.split()です。これは$pushオペレーションに$eachで適用される直接の「配列」です。

1件のリクエスト。

関連する問題