2016-07-15 114 views
1

我想在Node中編寫查詢,這樣mongo會告訴我是否有部分滿足搜索條件的結果。部分滿足條件的MongoDB結果

如果DB內部的數據組織這樣的:

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

此外,參數2是每個條目唯一的。

和查詢會是這樣的

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

從本質上講,我需要一個查詢,將告訴我,如果返回的結果(S)完全或部分滿足搜索條件。如果結果滿足param1和param2,但不是param3,則會在結果對象旁邊返回消息或錯誤。這可能在mongoDB中嗎? findOne()僅僅是一個例子,它不一定是一個findOne()查詢,或者一個查詢,如果它不可能的話。如果是這樣,那麼如何使用最少量的查詢來完成呢?

回答

2

如果我正確理解你的問題,你想返回從對象mongo集合並將信息附加到每個滿足條件的對象,而不是。假設我們有一個mongodb集合人員,其中的對象具有firstName,lastName和birthYear字段。我們可以利用這個聚集

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" ] } 
     } 
    } 

]); 

結果會是什麼樣子: {姓: 「諾瓦克」,名字: 「德約科維奇」,birthYear: 「1987」,matchConditions:222}

{姓:「諾瓦克」,名字: 「Petrovic的」,birthYear: 「1987」,matchConditions:212}

{姓: 「諾瓦克」,名字: 「Petrovic的」,birthYear: 「1989」,matchConditions:211}

{名字:「羅傑」,姓氏:「費德勒」,出生年:「1981」, matchConditions:111}

然後從matchCondition字段,您可以獲取對象滿足它的每個條件的信息。我希望這是你想要的。

0

您可以使用$ne表示不匹配值的字段。

下面將與PARAMS {'param1':'value1','param2':'value2','param3' : {'$ne' : 'value3'}}查詢,淘param2value1param1value2value3param3

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(...){}); 

,然後在結果中,你會寫自己的自定義邏輯來確定哪些參數都沒有發現。