MongoDb - 聚合:如何在子文档数组上使用$ elemMatch过滤数组文档?

时间:2016-01-11 16:15:07

标签: node.js mongodb mongoose aggregation-framework

我正在尝试在聚合上使用$ filter。我需要过滤一个名为“extras”的数组,该数组至少与他的“季节”中的一个相交,并给出“日期”。

这是一个例子:

var from = new Date(2016, 0, 1);
var to = new Date(2016, 0, 5)

var projection = {
    name: 1,
    units: 1,
    capacity: 1,
    availabilitySeasons: { // This works
      $filter: {
        input: '$availabilitySeasons',
        as: 'avSeason',
        cond: {
          $and: [{
            $lte: ['$$avSeason.from', to]
          }, {
            $gte: ['$$avSeason.to', from]
          }]
        }
      }
    },
    rate: 1,
    features: 1,
    extras: {
      $filter: { // $elemMatch is no valid
        input: '$extras',
        as: 'extra',
        cond: {
          $elemMatch: ['$$extra.seasons', {
            from: {
              $lte: from
            },
            to: {
              $gte: to
            }
          }]
        }
      }
    }
  };

在这种情况下可以使用$ filter吗?我是否必须匆匆通过$ unwind / $ group hell?

1 个答案:

答案 0 :(得分:0)

是的,你可以做到。 对于以下示例,请在 $和条件中使用 $ lte $ gte 的条件。

$project: {
       items: {
           $filter: {
              input: "$items",
              as: "item",
              cond: { 
                 $and: [ 
                    $lt: [ "$$item.price", 100 ],
                    $gt: [ "$$item.price", 50 ]
                 ] }
            }
       }
 }