首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$in操作符在$project,$match或find()中

$in操作符在$project,$match或find()中
EN

Stack Overflow用户
提问于 2018-04-07 08:25:10
回答 2查看 1.4K关注 0票数 0

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-07 11:42:35

回答你的问题:是的,但不是你所期望的那样。在聚合查询的$in或$match阶段使用$project操作符是可能的,但每个阶段的用法和用途并不完全相同。

“相同”$in操作符有两种截然不同的类型(造成语义混淆):

  1. Non-aggregational https://docs.mongodb.com/manual/reference/operator/query/in/:通常会缩小结果,就像过滤器一样。如果结果集不匹配,则无法将信息添加到结果集中。既可以在http://collection%20method集合方法中使用,也可以在聚合(相当混乱的语义啊?) https://docs.mongodb.com/manual/reference/operator/aggregation/match/中使用。
  2. Aggregational https://docs.mongodb.com/manual/reference/operator/aggregation/in/:通常将布尔信息添加到结果集,可以用作https://docs.mongodb.com/manual/reference/operator/aggregation/cond/内部的逻辑表达式,并且在与https://docs.mongodb.com/manual/reference/operator/aggregation/redact/一起使用时也可能删除某些结果。可用于https://docs.mongodb.com/manual/reference/operator/aggregation/project/https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/等(但不能(!)在find()或$match中使用。其结构是:{ $in: [ <needle expression>, <array haystack expression> ] },所有这条灰色线都变成了false (我使用了PHP文档的in_array指针-heystack语义来更好地解释)。因此,{ $in [ 'foo', [ 'foo', 'bar', 'baz' ] ] }真正的,因为foo在数组中。但是,在前面的非聚合$in中,{ maybeFooField: { $in: [ 'foo', 'bar', 'baz' ] } }结构查询只是缩小了结果集,而不会导致布尔值为true或false。

回到您的重构,问题是您的预期结果是什么?为什么从一开始就转向聚合框架?

如果只想缩小或过滤结果集,然后使用其他聚合计算,则使用简单的non-aggregational $in运算符。

代码语言:javascript
运行
复制
db.Doc.aggregate([
{ $match: { tags: {$in: ['tag1','tag2'] } } } // non-aggregational $in
])

但是,如果要根据某些标记的存在与否添加信息,请使用aggregational $in运算符。

代码语言:javascript
运行
复制
db.Doc.aggregate([
{ $project: { hasAnyTag: {$in: [$tags, ['tag1', 'tag2'] ] } } } // aggregational $in
])

注意,您有更多的聚合操作符可以处理数组,如:$setIntersection$setIsSubset

票数 2
EN

Stack Overflow用户

发布于 2018-04-07 08:44:18

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

代码语言:javascript
运行
复制
db.Doc.aggregate([
{$match:{tags: {$in: ['tag1','tag2'] }}}

])

当你在投影中使用$in时,如下所示:

代码语言:javascript
运行
复制
db.Doc.aggregate([
{$project:{tags: {$in: ['tag1','tag2'] }}}

])

结果将是tags:truetags:false,这取决于是否匹配。

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

https://stackoverflow.com/questions/49705416

复制
相关文章

相似问题

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