我有一个集合 products,其中包含这样的文档(产品)(仅相关代码):
{ "_id": "prod1", ... "colors": ["red","blue"], "size": ["S", "M"], ...}
{ "_id": "prod2", ... "colors": ["red","green"], "size": ["S", "XL"], ...}
{ "_id": "prod3", ... "colors": ["yellow","blue"], "size": ["XL", "XXL"], ...}
我想仅向用户提供可用的选择,作为分面搜索,例如选项的名称和可用选项的数量。
颜色:
red 2
blue 2
green 1
yellow 1
尺寸:
S 2
M 1
XL 2
XXL 1
如果我必须在 SQL 中执行此操作,我可能必须为每个方面组运行一个查询。
SELECT colors, count(*) AS number FROM products GROUP BY colors
比第二个查询
SELECT size, count(*) AS number FROM test GROUP BY sizes
如果有人选择颜色“红色”,那么我可能必须在每个查询中添加“WHERE”子句:
WHERE colors = 'red'
有比我更有经验的人可以帮我解决 MongoDB 中的这个例子吗?我是否必须运行两个查询,或者是否有我遗漏的东西可以在一个查询中完成?我想我会有大量的产品。任何帮助表示赞赏。特别是如果有任何技巧可以加快速度。我想从一开始就把它弄好,因此提出了这个问题。谢谢。
最佳答案
这是使用 MongoDB 聚合进行查询的解决方案。以下是我的虚拟收藏。
{
"_id" : ObjectId("584b82055855b8ea7ea29d65"),
"colors" : [
"Red",
"Yellow"
],
"size" : [
"S",
"M"
]
}
{
"_id" : ObjectId("584b82185855b8ea7ea29d66"),
"colors" : [
"Red",
"Orange"
],
"size" : [
"S",
"XL"
]
}
.
.
运行以下查询后。
db.getCollection('products').aggregate([
{$unwind : "$colors"},
{$group : {
_id : "$colors",
"sum": {$sum : 1}
}},
{
$project : {
_id : 0,
"color":"$_id",
"count":"$sum"
}
}
])
那么输出是:
{
"color" : "Green",
"count" : 2
}
{
"color" : "Orange",
"count" : 1
}
{
"color" : "Yellow",
"count" : 2
}
{
"color" : "Red",
"count" : 2
}
如果您只想查找红色 颜色的总和,那么在下面查询这个
db.getCollection('products').aggregate([
{$unwind : "$colors"},
{$match : {"colors":"Red"}},
{$group : {
_id : "$colors",
"sum": {$sum : 1}
}},
{
$project : {
_id : 0,
"color":"$_id",
"count":"$sum"
}
}
])
上述查询的输出是:
{
"color" : "Red",
"count" : 2
}
关于mongodb - 用于分面导航的 Mongo 聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34866059/
我正在用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.
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我知道我可以指定某些字段来使用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
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
我在Rails上使用带有ruby的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s
我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params