2016-07-15 5 views
1

検索条件を部分的に満たす結果があるかどうかmongoが教えてくれるように、ノードにクエリを書きたいと思っています。条件を部分的に満たすMongoDBの結果

DB内のデータは、このように編成されている場合:さらに

{ 
    param1: String, 
    param2: String, 
    param3: String 
} 

、PARAM2は、各エントリのためのユニークです。

とクエリは、基本的にこの

findOne({param1:'str1', param2:'str2', param3:'str3'}, function(...){}); 

ようなものになるだろう、私は返された結果(s)は、完全または部分的に検索基準を満たすなら、私に教えてくれますクエリを必要としています。結果がparam1とparam2を満たし、param3でない場合、結果のオブジェクトの横にメッセージまたはエラーが返されます。これはmongoDBで可能ですか? findOne()は単なる例であり、必ずしもfindOne()クエリである必要はなく、可能でない場合は単一のクエリである必要はありません。もしそうなら、どのように最小限の量のクエリを使ってそれを行うことができますか?

答えて

2

は私が正しくあなたの問題を理解していれば、あなたがからオブジェクトを返すようにしたいとmongoコレクションを作成し、それが満たしている条件とそうでない条件のそれぞれのオブジェクトに情報を添付します。 firstName、lastName、birthYearというフィールドを持つオブジェクトを持つmongodbコレクションの人がいるとします。 {firstNameの: "ノバック"、lastNameの: "ジョコビッチ"、birthYear: "1987"、matchConditions:222}

{firstNameの「ノバク我々は

db.person.aggregate([ 

    { 
     $project : { 
      firstName : "$firstName", 
      lastName : "$lastName", 
      birthYear : "$birthYear", 
      matchCondition1 : { $cond: { if: { $eq : [ "$firstName" , "Novak" ] }, then: 200 , else: 100 }} , 
      matchCondition2 : { $cond: { if: { $eq : [ "$lastName" , "Djokovic" ] }, then: 20 , else: 10 }} , 
      matchCondition3 : { $cond: { if: { $eq : [ "$birthYear" , 1987 ] }, then: 2 , else: 1 }} 
     } 
    }, 
    { 
     $project : { 
      firstName : "$firstName", 
      lastName : "$lastName", 
      birthYear : "$birthYear", 
      matchConditions : { $sum : [ "$matchCondition1", "$matchCondition2", "$matchCondition3" ] } 
     } 
    } 

]); 

結果は次のようになり、この凝集を使用することができます」とLastName: "ペトロヴィッチ"、birthYear: "1987"、matchConditions:212}

{firstNameの "ノバック" とLastName: "ペトロヴィッチ"、birthYear: "1989"、matchConditions:211}

{ firstName: "Roger"、lastName: "Federer"、birthYear: "1981"、 matchConditions:111}

次にmatchConditionフィールドから、オブジェクトが満たす条件の情報を取得できます。これがあなたの望むものだと私は期待しています。

0

$neは、値と一致しないフィールドに使用できます。

param1ためvalue1value2param2用とをマッチング、のparams {'param1':'value1','param2':'value2','param3' : {'$ne' : 'value3'}}でないvalue3param3を照会すれば、以下の通り:

var MongoClient = require('mongodb').MongoClient; 
var assert = require('assert'); 
var ObjectId = require('mongodb').ObjectID; 
var url = 'mongodb://localhost:27017/yourDB'; 

MongoClient.connect(url, function(err, db) { 

    assert.equal(null, err); 

    db.collection('yourCollection').find({'param1':'value1','param2':'value2','param3' : {'$ne' : 'value3'}}).toArray(function(err, doc) { 

     assert.equal(null, err); 

     if (doc != null) { 
     console.log(doc); 
     } 
    }); 
}); 
0

私は$orオペレータ

findOne($or: [{param1:'str1'}, {param2:'str2'}, {param3:'str3'}], function(...){}); 

を使用すると、結果には、あなたが見つかりませんでしたどのパラメータを決定するために、独自のカスタム・ロジックを記述します。

関連する問題