2017-02-10 32 views
0

我有一个flag和一个key

如果flagtrue我想列出name字段包含key的文档。

否则 - 如果flagfalse - 我想搜索关键字namesurname字段。

这里是收集的例子;

{id: 1, name: "green" , surname: "brown"}, 
{id: 2, name: "black" , surname: "brown"}, 
{id: 3, name: "brown" , surname: "yellow"} 

if flag:true,key:brown,I expect;

{id: 1, name: "green" , surname: "brown"}, 
{id: 2, name: "black" , surname: "brown"}, 
{id: 3, name: "brown" , surname: "yellow"} 

if flag:false,key:brown,I expect;

{id: 3, name: "brown" , surname: "yellow"} 

如何使用$ cond查找?

我可以做到这一点;

if(flag){ 
    db.collection.find({name: key}) 
}else{ 
    db.collection.find({$or: [{name: key}, {surname: key}]) 
} 

是这样的可能吗?但是这会引发错误。我如何编辑?

db.collection.find({$cond: [ if: { flag }, then: {$or: [{name: "brown"}, {surname: "brown"}]}, else: {name: "brown"} ]}) 
+0

'$ cond'是条件聚合算子。它不适用于常规查询。在客户端保持这种逻辑可能更好。 – Veeram

回答

0

$ cond是一个聚合管道运算符,您将无法按照您的预期使用。正如你所提到的那样,在客户端很容易做到这一点。

如果你必须它在查询本身;将不得不操纵如下条件:a)在一个查询中,标志结果条件的真值为真且假结果条件为假。 b)在第二个查询中,flag结果条件的真值为false,false结果条件为true。

然后[或]上述条件。

你可以使用$存在的属性的那始终存在文件给真实的标志=真;并使用$存在的一个属性,将从不存在在文档中给一个标志=真假为false。

下面是使用上述逻辑的解决方案:

var flag = true; 
var key = "brown"; 
db.collection.find({ 
    $or : [ { 
     $and : [ { _id : { $exists : flag } }, 
       { name : key } ] 
    }, { 
     $and : [ { _id_nonExist : { $exists : flag } }, 
       { $or : [ { name : key }, { surname : key } ] } ] 
    } ] 
}) 

我已经通过你的描述“不见了如果标志是真的,我要列出其名称字段包括密钥的文件 如果Otherwise-。 flag is false-我想搜索名字或姓氏字段上的键

相关问题