草庐IT

MongoDB 聚合带有选择字段的查询

coder 2023-11-03 原文

我想做一个聊天系统,还需要获取用户的最后一条消息。我也提供了查询,但它只返回用户的 userId。所以请帮助我,谢谢

数据库:

/* 1 */
{
    "_id" : ObjectId("56937df0418a6afab248616d"),
    "to" : ObjectId("56728051d4b426be03de18f2"),
    "from" : ObjectId("568e402eaecfa53282f60d17"),
    "msg" : "Hello!",
    "cd" : ISODate("2016-01-11T10:03:28.139Z"),
    "type" : "other",
    "ir" : 0
}

/* 2 */
{
    "_id" : ObjectId("56937e01418a6afab248616e"),
    "to" : ObjectId("568e402eaecfa53282f60d17"),
    "from" : ObjectId("56728051d4b426be03de18f2"),
    "msg" : "Hi!",
    "cd" : ISODate("2016-01-11T10:03:45.588Z"),
    "type" : "other",
    "ir" : 0
}

/* 3 */
{
    "_id" : ObjectId("56937e45418a6afab248616f"),
    "to" : ObjectId("56728051d4b426be03de18f2"),
    "from" : ObjectId("568e402eaecfa53282f60d17"),
    "msg" : "Shu che ela!",
    "cd" : ISODate("2016-01-11T10:04:53.280Z"),
    "type" : "other",
    "ir" : 0
}

查询:

db.getCollection('chat_message').aggregate( [
        { 
            $match: {
                ir: 0, 
                $or : [
                    {"to" : ObjectId("56728051d4b426be03de18f2")}
                ]  
            } 
        },

        { $group: { _id: "$from" } },

    ])

我运行这个查询但没有得到我想要的结果

要求出来了:

/* 1 */
{
    "result" : [ 
        {
            "_id" : ObjectId("568e402eaecfa53282f60d17"),
            "msg" : "Shu che ela!"
        }
    ],
    "ok" : 1.0000000000000000
}

最佳答案

你是对的,但你错过了一些关于 $mongo object Id的事情

In MongoDB, documents stored in a collection require a unique _id field that acts as a primary key.

因此,当您运行聚合查询时,$group 会为 from 键创建 _id 但在您的文档结构中看起来像 from 有两个具有相同 ObjectId 的文档,因为结果返回第一个匹配条件。这只返回 "msg": "Hello!","msg": "Shu che ela!" 先插入的文档先返回。

所以应该像这样改变你的聚合 {"$group":{"_id":"$_id","msg":{"$first":"$msg"}}}您将获得这两个文件。

关于MongoDB 聚合带有选择字段的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34720567/

有关MongoDB 聚合带有选择字段的查询的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  5. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  8. ruby-on-rails - Sphinx - 何时对字段使用 'has' 和 'indexes' - 2

    我几天前在我的ruby​​onrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag

  9. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

  10. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

随机推荐