2015-04-22 3 views
1

У меня есть коллекция кампаний, которая предназначена для рекламодателей. Это схема является:Диапазон совпадений значений для MongoDB

var campaignSchema = new mongoose.Schema({ 
    name: String, 
    sponsor: String, 

    [...] 

    target: { 
    age: { 
     lower: Number, 
     upper: Number 
    }, 
    gender: String, 
    locations: Array, // [ { radius: '', lon: '', lat: '' } ] 
    activities: Array 
    } 
}); 

Мне нужно выполнить запрос с определенным возрастом, и вернуть все кампании, где этот возраст составляет от age.lower и age.higher.

Я прочитал документы для $gt и $lt, однако они работают только в одном направлении (поэтому я мог бы указать диапазон и соответствовать значению, однако мне нужно указать значение и соответствовать диапазону).

Любые предложения?

ответ

0

Сначала вы можете создать запрос на нижней границе этого значения, отсортировать результаты в порядке убывания и получить верхний документ из результата. Сравните этот документ с верхней границей, если есть совпадение, тогда этот документ имеет диапазон, который содержит этот возраст. Например:

var age = 23; 
var ads = db.campaign.find({ "age.lower": {"$lte": age } }).sort({"age.lower": -1}).limit(1); 

if (ads != null) { 
    var result = ads[0]; 
    if (result.age.upper > age) { 
     return result; 
    } else { 
     return null; 
    } 
} 
0

Извините, я неправильно понял проблему, я получил ее сейчас.

db.collection.find({ "age.lower": { $lt: value1 }, "age.upper": { $gt: value1 } }); 

Так, например, если ваш диапазон составляет от 25 до 40, и value1 составляет 30, 25 < 30 и 40> 30 - совпадают!

Если вы используете тот же диапазон с 20, 25! < 20 - не совпадают.