假设您在 mongodb 中有一个可变大小的 map 。 如何获得只有特定 map 大小(例如 >2)的文档?
{map:{k1:v1, k2:v2, k3,v3}}
{map:{k1:v1, k2:v2}}
最佳答案
使用 MongoDB 3.6 及更高版本:
使用 $expr 运算符,这允许您使用聚合框架运算符,特别是 $objectToArray 将 map 子文档转换为键值数组的运算符,即
{ map: {
k1:v1,
k2:v2,
k3,v3
}}
转化为数组
{ map: [
{ k: 'k1', v: 'v1' },
{ k: 'k2', v: 'v2' },
{ k: 'k3', v: 'v3' }
]}
然后您可以使用数组来使用 $size 来获取长度并使用比较查询运算符进行比较 $gt .
下面的示例显示了完整的查询:
db.test.find({
"$expr": {
"$gt": [
{ "$size": { "$objectToArray": "$map" } },
2
]
}
})
对于不支持上述运算符的 MongoDB 版本,如果您想稍后对其进行查询,则需要预先计算此类映射大小,因此请考虑创建一个新字段 "keyCount" 包含 map 子文档的键数。考虑以下演示:
填充测试集合
db.test.insert([
{
"_id" : 1,
"map" : {
"k1" : "v1",
"k2" : "v2",
"k3" : "v3"
}
},
{
"_id" : 2,
"map" : {
"k1" : "v1",
"k2" : "v2"
}
}
]);
与当前设计一样,您需要一种机制来获取 map 文档中所有键的数量。这可以通过 Map-Reduce 实现。 。以下 mapreduce 操作将使用添加的新字段
要获取只有特定 map 大小的文档,例如 Map Reduce 输出 查询输出 "keyCount" 填充一个单独的集合:var mr = db.runCommand({
"mapreduce": "test",
"map" : function() {
var obj = this;
obj['keyCount'] = Object.keys(this.map).length;
emit(this._id, obj);
},
"reduce" : function(key, stuff) { return null; },
"out": "my_collection" + "_keys"
})
> 2,请对结果集合运行查询:db[mr.result].find({ "value.keyCount": { "$gt": 2 } });
/* 0 */
{
"result" : "my_collection_keys",
"timeMillis" : 7,
"counts" : {
"input" : 2,
"emit" : 2,
"reduce" : 0,
"output" : 2
},
"ok" : 1
}
/* 0 */
{
"_id" : 1,
"value" : {
"_id" : 1,
"map" : {
"k1" : "v1",
"k2" : "v2",
"k3" : "v3"
},
"keyCount" : 3
}
}
关于mongodb - 在MongoDB中查询 map 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372395/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在用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.
我知道我可以指定某些字段来使用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
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}
我需要从json记录中获取一些值并像下面这样提取curr_json_doc['title']['genre'].map{|s|s['name']}.join(',')但对于某些记录,curr_json_doc['title']['genre']可以为空。所以我想对map和join()使用try函数。我试过如下curr_json_doc['title']['genre'].try(:map,{|s|s['name']}).try(:join,(','))但是没用。 最佳答案 你没有正确传递block。block被传递给参数括号外的方法
我在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