是否可以根据$ cond修改查找的匹配条件

时间:2017-02-10 13:10:33

标签: mongodb if-statement find mongodb-query

我有一个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"}

如果flag:true,key:brown,我期待;

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

如果flag:false,key:brown,我期待;

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

1 个答案:

答案 0 :(得分:0)

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

如果必须在查询中执行;将不得不操纵条件

a)在一个查询中,flag结果条件的真值为true,false结果条件为false。

b)在第二个查询中,标志结果条件的真值为false,false结果条件为真。

然后[或]以上条件。

您可以在文档中使用$ exists存在 始终存在 的属性,以便为flag = true提供true;并在文档中使用$ exists存在 从不存在 的属性,为flag = 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 } ] } ]
    } ]
})

我已经删除了你的描述“如果该标志为真,我想列出其名称字段包含密钥的文档。 否则 - 如果标志为假 - 我想在名称或姓氏字段上搜索密钥。