部分满足条件的MongoDB结果
我想在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()查询,或者一个查询,如果它不可能的话。如果是这样,那么如何使用最少量的查询来完成呢?
如果我正确理解你的问题,你想返回从对象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字段,您可以获取对象满足它的每个条件的信息。我希望这是你想要的。
您可以使用$ne
表示不匹配值的字段。
下面将与PARAMS {'param1':'value1','param2':'value2','param3' : {'$ne' : 'value3'}}
查询,淘param2
value1
为param1
,value2
和不value3
为param3
:
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);
}
});
});
我会用$or
操作
findOne($or: [{param1:'str1'}, {param2:'str2'}, {param3:'str3'}], function(...){});
,然后在结果中,你会写自己的自定义逻辑来确定哪些参数都没有发现。