我试图查询数据库以从数组中获取特定元素,然后只对数组的一部分进行投影,下面是我尝试过的代码:
{ $project : {
name: 1,
language : 1 ,
season: [{
$filter: {
input: "$seasons",
as: "s",
cond: { $eq: [ "$$s.number", saison ] }
}
}, {
$project: {
'episodes.number': 1
}
}]
} }我只想得到与号码相匹配的季节,然后只投射数字字段。
下面是我的模式:
{
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,但是它返回了一个完整的数组,而不是我所需要的。谢谢。
发布于 2017-11-19 13:10:08
在聚合管道中有一个错误。你想说的是这个吗?
db.collectionName.aggregate([
{
$project: {
name: 1,
language: 1,
season: {
$filter: {
input: "$seasons",
as: "s",
cond: {
$eq: ["$$s.number", saison]
}
}
}
}
},
{
$project: {
'season.episodes.number': 1
}
}
])如果您只想返回一个没有完整数组结构的数字:
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中,这就是错误消息的原因。每个管道都是一个执行,所以不能有嵌套管道。如果您需要背靠背地执行两个项目,那么您可以像这样做:
{ $project: {...}}, { $project: {...}}字段number位于对象字段seasons中的数组episodes中,因此您忽略了这一点。
在您的$filter中,也不需要创建一个双数组。你这样做:
season: [{
$filter: {
input: "$seasons",
as: "s",
cond: { $eq: [ "$$s.number", saison ] }
} etc...它在数组中创建一个数组。除非你期望那种形式的结果,否则没有理由这样做。在我的回答中,我删除了嵌套数组的创建。
https://stackoverflow.com/questions/47377076
复制相似问题