如何在mongoDb中找到字段值的最长和最短长度?

sof*_*fs1 7 javascript mapreduce mongodb mongoid mongodb-query

字段的数据类型是String.我想找到mongoDB中字段的最长和最短值的长度.

我的收藏中共有500000份文件.

小智 8

用于获取字段的最长值

db.entities.aggregate([{ $match:{ condition   }  },{
  $addFields: {
    "length": { $strLenCP: "$feildName" }
  }},
{ "$sort": { "length": -1 } },
{$limit:1}
])
Run Code Online (Sandbox Code Playgroud)

将 { "$sort": { "length": -1 } } 更改为 { "$sort": { "length": 1 } } 以获取字段的最短值


Nei*_*unn 7

在现代版本中,MongoDB具有$strLenBytes$strLenCP聚合运算符,而不是简单地执行:

Class.collection.aggregate([
  { "$group" => {
    "_id" => nil,
    "max" => { "$max" => { "$strLenCP" => "$a" } },
    "min" => { "$min" => { "$strLenCP" => "$a" } }
  }}
]) 
Run Code Online (Sandbox Code Playgroud)

"a"您希望从中获取最小和最大长度的文档中的字符串属性在哪里.


要输出最小和最大长度,可用的最佳方法是使用mapReduce和一些技巧来保持值.

首先,您定义一个mapper函数,它实际上将从您的集合中输出单个项目以减少负载:

map = Q%{
    function () {

      if ( this.a.length < store[0] )
        store[0] = this.a.length;

      if ( this.a.length > store[1] )
        store[1] = this.a.length;

      if ( count == 0 )
        emit( null, 0 );

      count++;

    }
}
Run Code Online (Sandbox Code Playgroud)

因为这主要是使用全局范围的变量来保持最小和最大长度,所以您只想在finalize发出的单个文档的函数中替换它.没有reduce阶段,但为此定义了一个"空白"函数,即使它没有被调用:

reduce = Q%{ function() {} }

finalize = Q%{
    function(key,value) {
        return {
            min: store[0],
            max: store[1]
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用mapReduce操作:

Class.map_reduce(map,reduce).out(inline: 1).finalize(finalize).scope(store: [], count: 0)
Run Code Online (Sandbox Code Playgroud)

因此,所有工作都在服务器上完成,而不是通过迭代发送到客户端应用程序的结果.在这样的小集合上:

{ "_id" : ObjectId("543e8ee7ddd272814f919472"), "a" : "this" }
{ "_id" : ObjectId("543e8eedddd272814f919473"), "a" : "something" }
{ "_id" : ObjectId("543e8ef6ddd272814f919474"), "a" : "other" }
Run Code Online (Sandbox Code Playgroud)

你得到这样的结果(shell输出,但驱动程序大致相同):

{
    "results" : [
            {
                    "_id" : null,
                    "value" : {
                            "min" : 4,
                            "max" : 9
                    }
            }
    ],
    "timeMillis" : 1,
    "counts" : {
            "input" : 3,
            "emit" : 1,
            "reduce" : 0,
            "output" : 1
    },
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

因此mapReduce允许服务器上的JavaScript处理相当快速地执行此操作,从而减少网络流量.目前MongoDB没有其他原生方式可以返回字符串长度,因此在服务器上进行JavaScript处理是必要的.


gov*_*vin 6

您可以使用mongo shell脚本.请注意,它将执行全表扫描.

    function findMinMax() {
        var max = 0;
        var min = db.collection.findOne().fieldName.length;

        db.collection.find().forEach(function(doc) {
            var currentLength = doc.fieldName.length; 
            if (currentLength > max) {
               max = currentLength;
            }
            if (currentLength < min) {
               min = currentLength;
            }
        });

         print(max);
         print(min);
    }

   use <databaseName>
   findMinMax();
Run Code Online (Sandbox Code Playgroud)

您可以将该函数保存在文件c:\ minMax.js中并运行该文件,

c:\mongodb\bin> mongo dbName < c:\minMax.js
Run Code Online (Sandbox Code Playgroud)

注意:您可能需要提供必要的主机名,用户名和密码才能连接到您的数据库.

c:\mongodb\bin> mongo --host hostName --port portNumber -u userName -p password dbName < c:\minMax.js
Run Code Online (Sandbox Code Playgroud)