草庐IT

mongodb - 在MongoDB中查询 map 大小

coder 2023-11-04 原文

假设您在 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 操作将使用添加的新字段 "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"
})

要获取只有特定 map 大小的文档,例如 > 2,请对结果集合运行查询:

db[mr.result].find({ "value.keyCount": { "$gt": 2 } });

Map Reduce 输出

/* 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/

有关mongodb - 在MongoDB中查询 map 大小的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“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看起来疯狂不安全。所以,功能正常,

  2. 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.

  3. 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

  4. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  5. 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中提取小时

  6. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  7. ruby - 改变替换的大小写 - 2

    我有以下内容: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}

  8. ruby - 在 ruby​​ 中使用 .try 函数和 .map 函数 - 2

    我需要从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被传递给参数括号外的方法

  9. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  10. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个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

随机推荐