2017-02-10 16 views
0

У меня есть flag и key.

Если flag является true Я хочу перечислить документы, чье поле name содержит key.

Otherwise- если flag является false - Я хочу, чтобы найти ключ на name или surname полей.

Здесь приведен пример сбора;

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

если флаг: true, key: brown, я ожидаю;

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

если флаг: false, ключ: коричневый, я ожидаю;

{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) во втором запросе истинное значение для условия результата флага должно быть ложным и ложным условием получения результата.

И затем [или] выше условий.

Вы можете использовать $ существует атрибут, который всегда существует в документе, чтобы дать верно для флага = истина; и использовать $ существует атрибут, который будет никогда не существует в документе, чтобы дать false для флага = true.

Вот решение с использованием выше логики:

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 - я хочу искать ключ по полям имени или фамилии. «