2017-01-20 1 views
0

Я использую мангуст для получения значений в БД, которые могут соответствовать двум условиям с использованием $ или. Я хочу, чтобы ответ был отделен фильтром.

Cars.find({$or : [{color: 'blue'}, {color: 'red'}]}, function(Cars){ 
    console.log(Cars); 
}) 

этот код возврата:

[ 
{ 
    _id: 'Car1', 
    color: 'blue' 
}, 
{ 
    _id: 'Car2', 
    color: 'red' 
}, 
] 

Есть ли у вас какой-либо способ узнать, какие объекты соответствуют каждому условию? без реализации прямых сравнений в объектах.

так:

[ 
    [ //Array with objects with color = 'blue' 
    { 
     _id: 'Car1', 
     color: 'blue' 
    }, 
    ], 
    [ //Array with objects with color = 'red' 
    { 
     _id: 'Car2', 
     color: 'red' 
    }, 
    ], 
] 
+0

вы можете показать свой 'CArSchema' –

ответ

0

Может попробовать с aggregate запрос

Cars.aggregate([ 
    {$match:{color:{$in:['red','blue']}}}, 
    {$group:{_id:"$color",result: { $push: "$$ROOT" }}}, 
    {$project:{result:1,_id:0}} 
    ], function(err, cars){ 
     if(err) { 
      console.log(err); 
      // return error 
     } 
     console.log(cars); 
     // return success data 
}); 

ваш выход будет, как:

[ 
    { 
    "result" : [ 
     { 
      "_id" : "Car1", 
      "color" : "blue" 
     }, 
     { 
      "_id" : "Car3", 
      "color" : "blue" 
     } 
    ] 
}, 
{ 
    "result" : [ 
     { 
      "_id" : "Car2", 
      "color" : "red" 
     } 
    ] 
} 
] 
0

Это два отдельных запросов, так что вы можете просто сделать их по отдельности, а затем объединить результат. С точки зрения производительности это не было бы так плохо, если ваш рабочий набор помещается в памяти, и они индексируются:

const colors = [{color: 'blue'}, {color: 'red'}]; 
Promise.all(colors.map(color => Cars.find({ color }).then())) 
    .then(result => { 
    console.log('This is what you wanted:', result); 
    }); 
0

Я думаю, что вы можете использовать $groupaggregate оператор для этого.

Cars.aggregate(
    [ 
     { $group : { _id : "$color", cars: { $push: "$$root" } } } 
    ] 
); 

Это даст result что-то вроде этого:

{ 
    "_id" : "red", 
    "cars" ://array of red color cars 
    [ 
     { "_id" : "car2", "color" : "red"},//if other fields are present, that too 
     { "_id" : "car4", "color" : "red" }//...and so on 
    ] 
} 

{ 
    "_id" : "blue", 
    "cars" ://array of blue color cars 
    [ 
     { "_id" : "car1", "color" : "blue"}, 
     { "_id" : "car2", "color" : "blue" }//...and so on 
    ] 
} 

Для получения дополнительной информации о $group, пожалуйста, прочитайте MongoDB $group(aggregation) Documenatation.