首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$filter然后在聚合请求mongodb上执行$project

$filter然后在聚合请求mongodb上执行$project
EN

Stack Overflow用户
提问于 2017-11-19 12:54:04
回答 1查看 7.1K关注 0票数 0

我试图查询数据库以从数组中获取特定元素,然后只对数组的一部分进行投影,下面是我尝试过的代码:

代码语言:javascript
复制
{ $project : {
    name: 1,
    language : 1 ,
    season: [{
      $filter: {
        input: "$seasons",
        as: "s",
        cond: { $eq: [ "$$s.number", saison ] }
      }
    }, {
      $project: {
        'episodes.number': 1
      }
    }]
  } }

我只想得到与号码相匹配的季节,然后只投射数字字段。

下面是我的模式:

代码语言:javascript
复制
{
  name: {type: String},
  seasons: [{
    number: Number,
    episodes: [{number: Number, videos: [
      {
        provider: String,
        quality: String,
        language: String,
        added: { type: Date, default: new Date(1510272000000)  }
      }
      ]}]
  }]
}

我当前的查询正在生成一个错误: MongoError:无法识别的表达式' $project ',如果我在过滤器工作后不使用$project,但是它返回了一个完整的数组,而不是我所需要的。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-19 13:10:08

在聚合管道中有一个错误。你想说的是这个吗?

代码语言:javascript
复制
db.collectionName.aggregate([  
   {
        $project: {
            name: 1,
            language: 1,
            season: {
                $filter: {
                    input: "$seasons",
                    as: "s",
                    cond: {
                        $eq: ["$$s.number", saison]
                    }
                }
            }
        }
    },
    {
        $project: {
            'season.episodes.number': 1
        }
    }
])

如果您只想返回一个没有完整数组结构的数字:

代码语言:javascript
复制
db.collectionName.aggregate([  
   {
        $project: {
            name: 1,
            language: 1,
            season: {
                $filter: {
                    input: "$seasons",
                    as: "s",
                    cond: {
                        $eq: ["$$s.number", 1]
                    }
                }
            }
        }
    },
    { $unwind: "$season"},
    { $unwind: "$season.episodes"},
    {
        $project: {
            seasonEpisodeNumber: '$season.episodes.number'
        }
    }
])

未识别的表达式'$project‘

第二个$project位于第一个$project中,这就是错误消息的原因。每个管道都是一个执行,所以不能有嵌套管道。如果您需要背靠背地执行两个项目,那么您可以像这样做:

代码语言:javascript
复制
{ $project: {...}}, { $project: {...}}

字段number位于对象字段seasons中的数组episodes中,因此您忽略了这一点。

在您的$filter中,也不需要创建一个双数组。你这样做:

代码语言:javascript
复制
season: [{
      $filter: {
        input: "$seasons",
        as: "s",
        cond: { $eq: [ "$$s.number", saison ] }
      } etc...

它在数组中创建一个数组。除非你期望那种形式的结果,否则没有理由这样做。在我的回答中,我删除了嵌套数组的创建。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47377076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档