Mongo查询多条件

6

我有数据,

var data = [{name: 'n1', age: 22}, {name: 'n1', age: age: 11}, {name: 'n2', age: age: 16}, {name: 'n3', age: 22}];

我希望根据我的多种条件获取数据:

条件 1:- var query = {name: 'n1', age: 22};

条件 2:- var query = {name = '', age: 22}

我想要用一个查询来实现以下目标:

如果我运行条件 1,那么结果应该是

[{name: 'n1', age: 22}].

如果我运行条件2,则结果应该为:
[{name: 'n1', age: 22}, {name: 'n3', age: 22} ].

对于第二个条件,查询应该只搜索年龄字段。

我希望将所有这些功能都实现在一个查询中。

我的做法是:

$query:{$and: [{name: query.name}, {age: query.age}]}

它适用于第一个条件,但不适用于第二个条件。 如何在一次查询中实现它?

2个回答

6

将代码编写成仅查询你感兴趣的字段:

let criteria = [];

if (query.name && query.name.length > 0) {
   criteria.push({ name: query.name });
}

if (query.age && query.age > 0) {
   criteria.push({ age: query.age });
}

criteria = criteria.length > 0 ? { $and: criteria } : {};

现在您可以将您的条件传递给查询。

4
你可以创建一个查询对象,根据上述两个条件进行初始化。以下代码片段演示了这一点:

填充测试集合

db.test.insert([
    {name: 'n1', age: 22}, 
    {name: 'n1', age: 11}, 
    {name: 'n2', age: 16}, 
    {name: 'n3', age: 22}
])

初始化条件

var criteria = {},
    condition = [
        {"name": query.name}, 
        {"age": query.age}
    ]; 

if (query.name !== "") { criteria["$and"] = condition; }
else { criteria["$or"] = condition; }

第一种情况的测试标准:

var query = {"name": "n1", "age": 22 }
printjson(criteria);
db.test.find(criteria);

样例输出

{ "$and" : [ { "name" : "n1" }, { "age" : 22 } ] }

{ "_id" : ObjectId("56b341802ae7a05a8444cedc"), "name" : "n3", "age" : 22 }

第二个条件的测试标准

var query = {"name": "", "age": 22 }
printjson(criteria);
db.test.find(criteria);

样例输出

{ "$or" : [ { "name" : "" }, { "age" : 22 } ] }

{ "_id" : ObjectId("56b341802ae7a05a8444ced9"), "name" : "n1", "age" : 22 }
{ "_id" : ObjectId("56b341802ae7a05a8444cedc"), "name" : "n3", "age" : 22 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接