$ match在$ project阶段之后不过滤生成的字段中满足条件的记录

时间:2019-01-12 19:36:57

标签: mongodb

我有一个电影收藏集,我想查找所有带有一个单词名称的电影(例如:应返回“漂流”,而不是“鸟箱”)。我执行了以下操作,并且在Mongo Shell中执行命令后未返回任何内容。我看到只有'$ project'阶段的输出可以正常工作,所有的单字电影标题都具有'titleSize = true'。因此,我认为编写“ $ match”阶段的方式有问题。我是Mongo的新手,可能还不了解这个概念。我们将不胜感激,帮助您了解我在做什么错。

db.movies.aggregate([(
{$project:
 {_id:0,
  title:1, 
  "titleSize":{
               $eq:[{$size:{$split: ["$title"," "]}},1]
              }
 }
},
{$match:
 {"titleSize":true}
}
)])

1 个答案:

答案 0 :(得分:0)

还有一个更好的选择:$expr。通过find()方法将其用作查询:

db.movies.find({
    '$expr': {
        '$eq': [
            { '$size': { '$split': ["$title", " "] } },
            1
        ]
    }
})

或者,如果您仍在使用当前的聚合管道,请通过删除左括号和右括号以及一些额外的括号来对其进行调整,您最终应该拥有:

db.movies.aggregate([
    { $project: {
        _id: 0,
        title: 1,
        titleSize: {
            $eq: [
                { $size: {
                    $split: ["$title", " "]
                } },
                1
            ]
        }
    } },
    { $match: { titleSize: true } }
])