Mongo从对象数组中聚合$ or和$ match

时间:2018-07-15 10:48:41

标签: node.js mongodb

如何在汇总管道中结合$ match和$ or查找文档?

array filter.year:

[ { '$gte': '2015' },
  { '$gte': '2010', '$lte': '2015' },
  { '$gte': '2005', '$lte': '2010' },
  { '$gte': '2000', '$lte': '2005' },
  { '$lte': '2000' }
]

代码:

const query = [
{$match: {'active': filters.active}},
{
  $lookup: {
    from        : 'yachts',
    localField  : 'yachtId',
    foreignField: '_id',
    as          : 'yacht'
  }
},
     {$match: { $or: [{'yacht.specifications.constructionYear': filters.year}]}}
]

不返回任何文档。我想念什么吗?

1 个答案:

答案 0 :(得分:1)

您得到的$match阶段如下所示:

{ $or: [
  { 'yacht.specifications.constructionYear': [
    { '$gte': '2015' },
    { '$gte': '2010', '$lte': '2015' },
    { '$gte': '2005', '$lte': '2010' },
    { '$gte': '2000', '$lte': '2005' },
    { '$lte': '2000' }
   ] }
]}

它必须是:

{ $or: [
  { 'yacht.specifications.constructionYear': { '$gte': '2015' } },
  { 'yacht.specifications.constructionYear': { '$gte': '2010', '$lte': '2015' } },
  { 'yacht.specifications.constructionYear': { '$gte': '2005', '$lte': '2010' } },
  { 'yacht.specifications.constructionYear': { '$gte': '2000', '$lte': '2005' } },
  { 'yacht.specifications.constructionYear': { '$lte': '2000' } }
]}

如果您想使用filters简洁地编写它,可以执行以下操作:

{$match: { $or: filters.year.map(condition => {
  return {'yacht.specifications.constructionYear': condition}
})}}