Mongodb $project内的$in运算符,$match或find()

Mongodb $project内的$in运算符,$match或find(),mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个使用$in检查指定数组是否包含在集合字符串数组中的查找查询: db.Doc.find({tags:{'$in':['tag1','tag2']}}) 我正在重构此查询以使用聚合框架,但在$project或$match聚合阶段找不到等效的$in比较运算符 是否可以在聚合查询的$project或$match阶段使用$in比较运算符。查询:db.Doc.find({tags:{'$in:['tag1','tag2']})相当于: db.Doc.aggregate([ {$match:{tags

我有一个使用$in检查指定数组是否包含在集合字符串数组中的查找查询:

db.Doc.find({tags:{'$in':['tag1','tag2']}})

我正在重构此查询以使用聚合框架,但在
$project
$match
聚合阶段找不到等效的
$in
比较运算符


是否可以在聚合查询的
$project
$match
阶段使用
$in
比较运算符。

查询:
db.Doc.find({tags:{'$in:['tag1','tag2']})
相当于:

db.Doc.aggregate([
{$match:{tags: {$in: ['tag1','tag2'] }}}

])
当您在投影处使用
$in
时,如下所示:

db.Doc.aggregate([
{$project:{tags: {$in: ['tag1','tag2'] }}}

])

结果将是
标记:true
标记:false
,具体取决于是否存在匹配项。

回答您的问题:是的,但不是您所期望的。可以在聚合查询的$project或$match阶段使用$in运算符,但在每个阶段的用法和用途都不完全相同

有两种截然不同的“$in”运算符类型(造成语义混乱):

  • 非聚集性:通常缩小结果范围,如过滤器。如果结果集不匹配,则无法将信息添加到结果集。既可以在集合方法中使用,也可以在聚合方法中使用(相当混乱的语义啊?)
  • 聚合的:通常将布尔信息添加到结果集中,可以用作内部的逻辑表达式,也可以在与一起使用时删除一些结果。可用于等(但不能在find()或$match中使用(!)。结构是:
    {$in:[,和

    db.Doc.aggregate([
    { $match: { tags: {$in: ['tag1','tag2'] } } } // non-aggregational $in
    ])
    
    db.Doc.aggregate([
    { $project: { hasAnyTag: {$in: [$tags, ['tag1', 'tag2'] ] } } } // aggregational $in
    ])