Mongodb 子文档数组属性的范围查询
我有一系列的食谱,上面有各种各样的食物。每个服务都有一个数字能量属性。我需要选择至少有一份能量在给定范围内的所有食谱 例如,我有两个食谱:Mongodb 子文档数组属性的范围查询,mongodb,Mongodb,我有一系列的食谱,上面有各种各样的食物。每个服务都有一个数字能量属性。我需要选择至少有一份能量在给定范围内的所有食谱 例如,我有两个食谱: { title: 'Greek salad', servings: [ { energy: 100 }, { energy: 150 } ] }, { title: 'Smashed potatoes', servings: [ { energy: 150
{
title: 'Greek salad',
servings: [
{
energy: 100
},
{
energy: 150
}
]
},
{
title: 'Smashed potatoes',
servings: [
{
energy: 150
},
{
energy: 200
}
]
}
我正在寻找一个只匹配希腊沙拉
的查询,因为范围是90..110
,并且140..160
范围的两种配方
我想到的最好的办法是:
db.recipes.find({$and: [
{'servings.energy' : {$gt: 90}},
{'servings.energy' : {$lt: 110}}
]}
匹配2个结果,这不是预期的结果
另外,集合中有超过1M条记录,我正在寻找一个完全没有索引的查询。也许我可以通过某种方式更改数据结构以满足我的需要?您可以使用以下聚合查询来获得预期的结果:
db.testso.aggregate([
{$match: { "servings.energy": { $gt: 90, $lt:110 }}},
{$unwind:"$servings"},
{$match: { "servings.energy": { $gt: 90, $lt:110 }}}
]);
您可以使用mongodb操作符执行此操作:
db.getCollection('recipes').aggregate([
{$project: {
recipe: "$$ROOT",
servings: {$filter: {
input: "$recommendedServings",
as: "serving",
cond: {
$and: [{$gt: ['$$serving.energy', 400]},
{$lt: ['$$serving.energy', 410]}]
}
}}
}},
{$match: {"servings.0": {$exists: true}}}
])
以下结果是否适用于范围140..160?{title:'希腊沙拉',服务:[{energy:150}]},{title:'碎土豆',服务:[{energy:150}]}@volodymyrsynytsky我确定,但是查询应该尽可能快地执行。有一百万条记录。可能的重复记录无法展开,因为我有大约五十万条记录更新了查询,请现在再次检查。很好的尝试,但第一次匹配实际上匹配了我的所有记录,因此它与展开整个集合基本相同