假设我有两个城市之间的旅行信息数据。例如,
{ from: 'Paris', to: 'New York' }
{ from: 'New York', to: 'Paris' },
{ from: 'London', to: 'Moscow' },
{ from: 'Paris', to: 'New York' }
// etc...
我想计算在某些城市之间旅行的次数。诀窍在于,从伦敦到莫斯科的旅行应该与从莫斯科到伦敦的旅行一样对待,即旅行的方向无关紧要。 如何使用 mongodb 聚合框架实现这一目标?
按两个字段简单分组不会忽略方向
db.trips.aggregate([
{$group: { _id: { from: "$from", to: "$to" }, count: { $sum: 1} } }
])
会导致以下结果
{ _id: {from: 'New York', to: 'Paris'}, count: 1 },
{ _id: {from: 'London', to: 'Moscom'}, count: 1 },
{ _id: {from: 'Paris', to: 'New York'}, count: 2 }
// etc...
但我希望它说明巴黎和纽约之间的行程已经进行了 3 次。
附言这篇文章的标题可能没有很好地描述我想要实现的目标,但不幸的是我当时想不出更好的。因此,请随意进行修改。
最佳答案
非常有趣的问题。我找到了一种方法,虽然有点棘手,但它确实有效。
快速回答:
db.travels.aggregate([
{
$project:
{
city1:
{
$cond: { if: { $gte: [ "$from", "$to" ] }, then: "$to", else: "$from" }
},
city2:
{
$cond: { if: { $lt: [ "$from", "$to" ] }, then: "$to", else: "$from" }
}
}
}
,{
$group:
{
_id:
{
from: "$city1",
to: "$city2"
}
,count: { $sum: 1}
}
}
])
解释:
首先,使用 $project 我使用 $cond按字母顺序排列 $from 和 $to。 city1(new $from)始终是按字母顺序排列的具有“最小”字母的城市。 city2 始终是“最大的”。
然后,在 $project 的末尾,我有你需要的东西,我使用你的 $group (顺便说一句,你的代码中有错字, count 应该在括号之前)。
结果:
{
"result": [
{
"_id": {
"from": "London",
"to": "Moscow"
},
"count": 1
},
{
"_id": {
"from": "New York",
"to": "Paris"
},
"count": 3
}
],
"ok": 1
}
关于mongodb - 包含多个字段的组,但将字段视为相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34121837/
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我知道我可以指定某些字段来使用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