2016-07-15 91 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(...){}); 

,然后在结果中,你会写自己的自定义逻辑来确定哪些参数都没有发现。