【问题标题】:What is the difference between these two MongoDB queries?这两个 MongoDB 查询有什么区别?
【发布时间】:2017-04-19 15:06:21
【问题描述】:

目标

找出以下 MongoDB 查询中可能存在的差异,并了解其中一个有效而另一个无效的原因。

背景

不久前,我发布了一个问题,寻求有关 MongoDB 查询的帮助:

在那个问题中,我的查询不起作用,我正在寻找解决方法。我在 cmets 中得到了很多帮助,最终找到了解决方案,但似乎没有人能够解释为什么我的第一个错误查询不起作用,而第二个却可以。

代码

第一个(不正确的)查询:

pipeline = [
        {"$group": {"_id": "$user.screen_name", "tweet_texts": {"$push": "$text"}, "count": {"$sum": 1}}},
        {"$project": {"_id": "$user.screen_name", "count": 1, "tweet_texts": 1}},
        {"$sort" : {"count" : -1}},
        {"$limit": 5}
    ]

第二次查询:

pipeline = [ 
        {"$group": {"_id": "$user.screen_name", "tweet_texts": {"$push": "$text"}, "count": {"$sum": 1}}}, 
        {"$sort" : {"count" : -1}}, 
        {"$limit": 5}
    ]

现在,有意识的眼睛会看到两个查询之间的区别是项目阶段{"$project": {"_id": "$user.screen_name", "count": 1, "tweet_texts": 1}}

当时我认为这个阶段是必要的,但是由于我已经在$group阶段选择了我需要的字段,所以我真的不需要它。事实上,这个额外且不必要的阶段导致测试失败。

问题

如果第一个示例中的$project 阶段没有用,并且与$group 阶段做同样的事情,为什么我的代码会失败?不应该根本没有区别吗(因为变化是幂等的?)

【问题讨论】:

  • 我没有收到任何通知,因为提到 @chidram 而不是 chridam 有错字。我一有空闲时间就会尝试回答这个问题。

标签: mongodb mongodb-query pymongo


【解决方案1】:

在第一次查询中,小组赛结束后,用户屏幕名称值保存在_id键下。不在user.screen_name 键下,因此,该值不会是projected,因为没有键。

如果你修改你的投影,使用

{"$project": {"_id": "$_id", "count": 1, "tweet_texts": 1}},

{"$project": {"_id": 1, "count": 1, "tweet_texts": 1}},

{"$project": {"count": 1, "tweet_texts": 1}},

第一个管道将类似于第二个管道。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多