jjzjj

mongodb/ meteor : how to I get the value of one field corresponding to the $max value of another field?

coder 2023-11-06 原文

我有一个包含以下字段的消息集合:_idsenderIdreceiverIddateSubmittedMsmessage,对于给定的用户,我想将所有其他用户的最新消息返回给他。因此,例如,如果有用户 Alex、Barb、Chuck、Dora,我想返回 Alex 与 Barb、Chuck 和 Dora 之间的最新消息。做这个的最好方式是什么?我可以使用聚合一步完成吗?

官方在线文档 (http://docs.mongodb.org/manual/reference/aggregation/min/) 中的聚合示例显示了如何在集合中找到最低年龄的群体,但我需要的是类似于在人群中找到最年轻的人的名字。

这是我目前的做法:

第 1 步:在 Alex 发送和接收的所有消息中找到 dateSubmitted 的最大值,对其他用户进行分组:

var M = Messages.aggregate(
{$match: 
    {$or: [{senderId: 'Alex'}, {receiverId: 'Alex'}]}
}, 
{$group: {_id: "$receiverId", lastestSubmitted: {$max: "$submitted"} }}).fetch();

第 2 步:创建一个由这些最高提交日期值组成的数组:

var MIds = _.pluck(M,'lastestSubmitted');

第 3 步:按 senderId、receiverId 和 latestSubmitted 查找这些消息:

return Messages.find(
    {submitted: {$in: MIds}, $or: [{senderId: 'Alex'}, {receiverId: 'Alex'}]},
    {$sort: {submitted: 1}}
});

这有两个问题:

  1. 可以一步完成而不是三步吗?也许通过 mapReduce 或聚合命令?
  2. 不是只对 receiverId: 'Alex' 进行分组,有没有一种方法可以对类似的内容进行分组:$or [{receiverId: 'Alex', senderId: 'Barb' }, {senderId: 'Alex', receiverId: 'Barb'}]? (但对于每个其他用户)这将允许我在 Alex 与之交谈的任何两个参与者之间的对话中获得最新消息。例如:

有什么建议吗?

最佳答案

您唯一需要更改的是分组阶段的 group._id。虽然您可以为此建议使用文档,而不仅仅是一个字段,但您可以在同一管道中应用排序。但是,如果您仅使用 receiverId 进行分组,则不会发生变化。

var M = Messages.aggregate(
{$match: 
    {$or: [{senderId: 'Alex'}, {receiverId: 'Alex'}]}
}, 
{$group: 
    {_id: {
          receiverId: "$receiverId", 
          senderId: "$senderId"}, 
      lastestSubmitted: {$max: "$submitted"} }
 },
 {$sort: {submitted: -1}
 },
 {$limit: 1}
 ).fetch();

上面的这个例子只增加了检查第二个最近 ping 连接或第三个连接的可能性,如果你只可能得到你甚至不需要分组的最新消息。只需运行这个:

var M = Messages.aggregate(
{$match: 
    {$or: [{senderId: 'Alex'}, {receiverId: 'Alex'}]}
}, 
 {$sort: {submitted: -1}
 },
 {$limit: 1}
 ).fetch();

上面的答案是为了获取单个用户和其他用户之间的最新消息,以获取涉及用户的所有对之间的最新消息阅读>>>

根据评论,我误解了一点问题,但上面的部分还是很有用的。您的问题的正确解决方案如下。在这种情况下,难点在于获得用于分组的键并识别交换对(bob -> tom == tom -> bob)。您可以使用条件和排序来识别掉期。 (这当然是一个更难的问题)代码如下所示:

var M = Messages.aggregate(
{$match: 
    {$or: [{senderId: 'Alex'}, {receiverId: 'Alex'}]}
},
{$project:
    {'part1':{$cond:[{$gt:['$senderId','$receiverId']},'$senderId','$receiverId']},
     'part2':{$cond:[{$gt:['$senderId','$receiverId']},'$receiverId','$senderId']},
     'message':1,
     'submitted':1
    }
},
{$sort: {submitted: -1}},
{$group: 
    {_id: {
          part1: "$part1", 
          part2: "$part2"}, 
      lastestSubmitted: {$first: "$submitted"},
      message: {$first: "$message"} }
 }
 ).fetch();

如果您不熟悉上面使用的某些运算符,例如 $cond 或 $first,请查看 this .

关于mongodb/ meteor : how to I get the value of one field corresponding to the $max value of another field?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19105313/

有关mongodb/ meteor : how to I get the value of one field corresponding to the $max value of another field?的更多相关文章

  1. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  2. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  3. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  4. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  5. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

  6. Elasticsearch和MongoDB对比 - 2

    文章目录Elasticsearch和MongoDB对比关于ElasticsearchElasticsearch应用场景关于MongoDBMongoDB优点mongodb适用场景Elasticsearch和MongoDB对比Elasticsearch和MongoDB开源许可协议参考Elasticsearch和MongoDB对比关于Elasticsearch官网:https://www.elastic.co/cn/elasticsearch/Elasticistheleadingplatformforsearch-poweredsolutions.Weaccelerateresultsthatma

  7. javascript - 无法使用 Meteor 读取未定义的属性 'bcrypt' - 2

    我正在按照基本教程使用TurkServer,但从一开始就出现错误。运行时出现的错误:meteor--settingssettings.jsonW20160615-01:19:27.320(-4)?(STDERR)W20160615-01:19:27.406(-4)?(STDERR)~/.meteor/packages/meteor-tool/.1.3.3.b5ue33++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:28

  8. javascript - 如何防止 Meteor.js 模板在没有数据的情况下呈现 - 2

    有人可以帮我理解Meteors模板的行为吗?我想在我的项目中实现一个通知系统,类似于ApplesGrowl。当记录写入数据库时​​,它使用简单的jQuery效果使消息出现。我简化了代码示例,以显示基本问题:代码:varMessages=newMeteor.Collection("messages");if(Meteor.isClient){Template.Notification.Message=function(){returnMessage.findOne({},{sort:{seq:-1}});};Template.Notification.rendered=function(

  9. javascript - meteor 包加载顺序 - 2

    我在Meteor上添加包的顺序对结果有什么影响吗?假设我使用bootstrap3和accountsui与bootstrap3,如果我先添加后者,反之亦然,会以同样的方式工作吗? 最佳答案 在Meteor中,您添加它们的包顺序无关紧要。meteor中有一个名为linker的模块,它分析每个包的依赖关系以确保首先加载依赖关系。例如:如果bootstrap-3是accounts-ui-bootstrap-3的依赖项,那么即使添加了bootstrap-3之后,它将首先加载。 关于javascri

  10. javascript - Meteor 的 Iron Router 不关闭模态对话框 - 2

    我正在使用Meteor和IronRouter,并且我有一个模态对话框,当它被关闭时不会隐藏背景。更准确地说,我希望在单击关闭按钮后,ironrouter将重定向到另一个页面。重定向代码确实有效,但背景仍然可见。如果我删除路由线-模式将被关闭,背景也将被关闭。这是模态框的标记:×Areyousure?Thiscannotbeundone.YesNo这是切换模态对话框的按钮:Delete这是确认模式对话框的"is"按钮上的点击事件:'click#confirm-yes-button':function(){Recipes.remove(this._id);$('#confirm

随机推荐