我有一个flag
和一个key
。
如果flag
为true
,我想列出name
字段包含key
的文档。
否则 - 如果flag
是false
- 我想在name
或surname
字段中搜索密钥。
这里是收集的例子;
{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"} ]})
答案 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 } ] } ]
} ]
})
我已经删除了你的描述“如果该标志为真,我想列出其名称字段包含密钥的文档。 否则 - 如果标志为假 - 我想在名称或姓氏字段上搜索密钥。“