2015-04-22 108 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.lowerage.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,和值1为30,25 < 30和40> 30 - 匹配!

如果您使用与20,25相同的范围! < 20 - 不匹配。