zoukankan      html  css  js  c++  java
  • 分片与非分片使用聚合的区别

    $collStats

    对于副本集中的集合或 集群中的非分片集合,collStats输出单个文档。对于分片集合,collStats每个分片输出一个文档。

    count字段

    计数基于集合的元数据,它为分片集群提供快速但有时不准确的计数。

    非分片集合

    使用语句:

    use data;
    db.datas.aggregate({
        $collStats:{
          count: {},
        }}
    )

    输出结果:

    { 
        "ns" : "data.datas", 
        "host" : "A:27017", 
        "localTime" : ISODate("2021-08-26T03:00:06.341+0000"), 
        "count" : NumberInt(16)
    }

    分片集合

    使用语句:

    use test2;
    db.test21.aggregate({
        $collStats:{
          count: {},
        }}
    )

    输出结果:

    { 
        "ns" : "test2.test21", 
        "shard" : "rs0", 
        "host" : "A:27001", 
        "localTime" : ISODate("2021-08-26T02:59:18.063+0000"), 
        "count" : NumberInt(31268)
    }
    { 
        "ns" : "test2.test21", 
        "shard" : "rs2", 
        "host" : "A:27022", 
        "localTime" : ISODate("2021-08-26T02:59:18.063+0000"), 
        "count" : NumberInt(1)
    }
    { 
        "ns" : "test2.test21", 
        "shard" : "rs1", 
        "host" : "A:27012", 
        "localTime" : ISODate("2021-08-26T02:59:18.064+0000"), 
        "count" : NumberInt(28731)
    }

    $currentOp*

    在启用了身份验证的独立集或副本集上,如果allUsers参数设置为 true,则需要inprog特权才能运行$currentOp。

    在分片群集上,需要inprog特权才能运行所有$currentOp管道。

    $graphLookup

    from字段

    from中指定的集合不能为sharded。但是,可以对运行aggregate()方法的集合进行分片。也就是说,在下面:

    db.collection.aggregate([
       { $graphLookup: { from: "fromCollection", ... } }
    ])
    • collection可以被分片。
    • fromCollection无法分片。

    要加入多个分片集合,请考虑:

    • 修改 Client 端应用程序以执行手动查找,而不是使用$graphLookup聚合阶段。
    • 如果可能,请使用嵌入式数据模型消除加入集合的需要。

    $indexStats

    shard输出字段

    与主机关联的分片的名称

    仅适用于分片集群。

    非分片集合

    使用语句:

    use data;
    db.datas.aggregate([
    { $indexStats: { } }
    ])

    输出结果:

    { 
        "name" : "_id_", 
        "key" : {
            "_id" : NumberInt(1)
        }, 
        "host" : "A:27017", 
        "accesses" : {
            "ops" : NumberLong(1), 
            "since" : ISODate("2021-08-26T02:09:10.509+0000")
        }, 
        "spec" : {
            "v" : NumberInt(2), 
            "key" : {
                "_id" : NumberInt(1)
            }, 
            "name" : "_id_"
        }
    }
    ……

    分片集合

    使用语句:

    use test2;
    db.test21.aggregate([
    { $indexStats: { } }
    ])

    输出结果:

    { 
        "name" : "_id_", 
        "key" : {
            "_id" : NumberInt(1)
        }, 
        "host" : "A:27001", 
        "accesses" : {
            "ops" : NumberLong(1), 
            "since" : ISODate("2021-08-26T02:06:27.765+0000")
        }, 
        "shard" : "rs0", 
        "spec" : {
            "v" : NumberInt(2), 
            "key" : {
                "_id" : NumberInt(1)
            }, 
            "name" : "_id_"
        }
    }
    ……

    $lookup

    对同一数据库中的未分片集合执行左外部联接,以从“被联接”集合中过滤文档以进行处理。

    from字段

    指定在同一数据库中执行连接的集合。该from集合不能被分片。

    在$lookup阶段,from集合不能被分片。但是可以对运行该aggregate()方法的集合进行分片。具体来说,在这个例子中:

    db.collection.aggregate([
       { $lookup: { from: "fromCollection", ... } }
    ])
    • 该collection可以分片。
    • 在fromCollection不能分片。
      要将分片集合与未分片集合连接,请在分片集合上运行聚合并查找未分片集合。例如:
    db.shardedCollection.aggregate([
       { $lookup: { from: "unshardedCollection", ... } }
    ])

    或者,或者要加入多个分片集合,请考虑:

    • 修改客户端应用程序以执行手动查找而不是使用$lookup聚合阶段。
    • 如果可能,请使用无需加入集合的嵌入式数据模型。
    • 如果可能,使用Atlas Data Lake $lookup 管道阶段来查找分片集合。

    如果from集合为分片集合,则会显示:

    { 
        "ok" : 0.0, 
        "errmsg" : "test2.inventory cannot be sharded", 
        "code" : 28769.0, 
        "codeName" : "Location28769", 
        "operationTime" : Timestamp(1629959728, 1), 
        "$clusterTime" : {
            "clusterTime" : Timestamp(1629959728, 1), 
            "signature" : {
                "hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 
                "keyId" : 0.0
            }
        }
    }

    $merge

    into字段

    • 如果输出集合不存在,则$merge 创建集合:
      • 对于副本集或独立的,如果输出数据库不存在,$merge 也会创建数据库。
      • 对于分片cluster,指定的输出数据库必须已经存在。
    • 输出集合可以是分片集合。

    on字段

    • 如果现有输出集合未分片,则on 标识符默认为该_id字段。
    • 如果现有输出集合是分片集合,则 on标识符默认为所有分片键字段和_id字段。如果指定不同的 on标识符,则on必须包含所有分片键字段。

    whenMatched字段

    "replace"操作:执行replace时,替换文档不能导致_id值的修改,或者如果输出集合是分片的,则不能修改分片键值。否则,操作会产生错误。
    "merge" (默认)操作:执行merge时,合并的文档不能导致_id值的修改,或者如果输出集合是分片的,则不能修改分片键值。否则,操作会产生错误。

    输出到分片集合

    mergemerge采用_id字段和所有的分片键字段作为默认的on标识符。如果重写默认值,则on标识符必须包含所有分片键字段。

    $out

    db字段

    • 对于副本集或独立的,如果输出数据库不存在,$out也会创建数据库。
    • 对于分片cluster,指定的输出数据库必须已经存在。

    您不能将分片集合指定为输出集合。管道的输入集合可以分片。要输出到分片集合,请参阅$merge (从 MongoDB 4.2 开始可用)。

    $planCacheStats

    $planCacheStats在副本集上,该操作仅从副本集的一个成员收集计划缓存信息,而在分片集群上,该操作仅从每个分片副本集的一个成员收集计划缓存信息。

    host输出字段

    在分片集群上运行时,该操作从每个分片副本集中的单个成员返回计划缓存条目信息。该成员由shard和host 字段标识。

    shard输出字段

    从中$planCacheStats 检索缓存条目的分片的名称。
    仅在分片集群上运行时可用。

    $sort

    当您在分片集群上使用$sort时,每个分片都使用可用的索引对其结果文档进行排序。然后分片 mongos或分片之一执行流式归并排序。

    $unionWith

    如果unionWithlookup pipeline的一部分,则$unionWith的coll集合不能是分片集合。

  • 相关阅读:
    [小技巧]虚拟机服务管理小程序
    JNI学习
    Java读取Properties文件的七种方法
    UFLDL教程练习(exercise)答案(1)
    win7让库显示“我的电脑”
    关于asp.net中绑定的模版列CheckBox无法触发OnCheckedChanged事件的问题
    使用OLEDB读取不同版本Excel数据的连接字符串设置
    身为程序员,电脑的时间格式是不能随意设置的
    实现sqlserver数据根据不同时间周期分组
    常用Web Service汇总(天气预报、时刻表等)【转】
  • 原文地址:https://www.cnblogs.com/aojun/p/15190222.html
Copyright © 2011-2022 走看看