sql >> データベース >  >> NoSQL >> MongoDB

クエリが正しく機能しない状態でforEach内にプッシュ

    これは非同期の問題です。コールバック内に配列の値を入力しています。ただし、イベントループの性質上、console.logまでにコールバックが呼び出されることはありません。 実行されます。

    あなたは約束を含む解決策について言及しました、そしてそれはおそらく正しい策略です。たとえば、次のようなものです。

    exports = function(orgLoc_id, data) {
      // ...
      let stream_ids = [];
      const promises = data.map(function(stream) {
        return streamsCollection.findOne({ _id: stream.stream_id }, { type: 1, sizes: 1 })
          .then(res => { //if I comment this query it will push without any problem
            if (res) {
              let newId = new BSON.ObjectId();
              // ...
              stream_ids.push(newId);
            }
          })
      })
    
      Promise.all(promises).then(function() {
        console.log('stream ids: ' + stream_ids);
    
        //TODO
        // any code that needs access to stream_ids should be in here...
      });
    };
    

    forEachの変更に注意してください mapへ ...そうすれば、すべてのPromiseの配列を取得できます(findOneを想定しています) .thenのためにpromiseを返しています 。

    次に、Promise.allを使用します すべての約束が解決するのを待ってから、アレイを用意する必要があります。

    補足:より洗練されたソリューションには、newIdを返すことが含まれます。 .thenの内部 。その場合、Promise.all 実際には、すべてのpromiseの結果の配列で解決されます。これは、newIdの値になります。 。




    1. ISO日付が文字列フィールドに格納されているMongoDBコレクションの日付範囲をクエリするにはどうすればよいですか?

    2. MongoDBで日付フィルター(週、月、カスタムの日付)に基づいてドキュメントを取得するにはどうすればよいですか?

    3. MongoDBは、外部キーを使用してフィールドを別のコレクションにコピーします

    4. redisdbsizeコマンドの精度