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 }}}
]);
  • 首先根据您的条件匹配记录-这将从子文档中获取两条记录
  • 现在根据servings数组展开记录
  • 现在根据您的条件再次匹配记录

  • 您可以使用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我确定,但是查询应该尽可能快地执行。有一百万条记录。可能的重复记录无法展开,因为我有大约五十万条记录更新了查询,请现在再次检查。很好的尝试,但第一次匹配实际上匹配了我的所有记录,因此它与展开整个集合基本相同