2017-08-24 3 views
0

私はダイナミックMongoDBのクエリ

{ 
    { 
     field: 'estimatedTime', 
     operator: '<=' 
     value: '50' 
    }, 
    { 
     field: 'message', 
     operator: 'contains' 
     value: 'meow' 
    }, 
    ... 
} 

のようないくつかのフィルタ条件に含まれているJSONを持って、私は正しくクエリ

{ '$ elemMatch' でそれを翻訳:{ 'estimatedTime':{ '$ {'$ regex': 'meow'}}}

ネストされた配列を持つJSONでクエリを実行する必要があるため、elemMatchを使用しています。その配列フィールドを 'プロパティ'と呼ぶことにしましょう。 MongoDBでクエリを起動しても問題ありません。プリント全く何も:私はにconsole.log(+人物 "トピック")のNode.js

users_with_filters.forEach(function(value) { 
       console.log(res.id); 
       var criteria = {}; 
       criteria['$elemMatch'] = JSON.parse(value.filter[0].filter).criteria; 
       console.log(criteria); 
       Topic.find({'_id': new ObjectId('599ea4b7b924bf16409c67cc'), 'properties': criteria}, function (err, person) { 
        if (err) { 
         console.log(err);   
         //return res.send(err); 
        } 
        console.log("Topic: " + person) 
       }); 
      }) 

をクエリを使用する場合

問題があります。

私は次のようにクエリをハードコーディングするかの間:

Topic.find({'_id': new ObjectId('599ea4b7b924bf16409c67cc'), 'properties': {'$elemMatch': { 'estimatedTime': {'$lte': 50}, 'message': {'$regex': 'meow'}}}}, function (err, person) ... 

はconsole.log( "トピック:" +人)私が探しています何プリント。

私は間違っていますか?ありがとう。

答えて

0

@JackLametta何ここで起こることは

データベースクエリは、常に通常の声明に比べ鈍化しても「JSON.parse」に、あなたがcriteriaを使用して、データベースにクエリを記述する際にしているということです、我々新たな「基準」を持つだろう。

このアプローチを使用できます。

users_with_filters.forEach(function(value) { 
       console.log(res.id); 
      someone(JSON.parse(value.filter[0].filter).criteria); 
      }) 
function someone(data){ 
    var criteria = {}; 
       criteria['$elemMatch'] = data; 
       console.log(criteria); 
       Topic.find({'_id': new ObjectId('599ea4b7b924bf16409c67cc'), 'properties': criteria}, function (err, person) { 
        if (err) { 
         console.log(err);   
         //return res.send(err); 
        } 
        console.log("Topic: " + person) 
       }); 

} 

また、foreachではなくpromiseとasyncを使用してください。

+0

提案された解決策は機能しません。 – JackLametta

+0

console.log(基準)を印刷するときに得られるもの。私のアプローチで –