13

特定の文字列/テキスト フィールドの長さを見つけるために mongodb にクエリを実行するにはどうすればよいですか?

また、クエリ セットの最大長はどのようにして確認できますか?

4

6 に答える 6

5

残念ながら、集計フレームワークは、クエリの実行中に文字列をその長さに自動的に変換する「len」演算子をサポートしていません。したがって、これを独自のコードで解決する必要があります。あなたは出来る

  1. MapReduce関数を使用して文字列の長さを計算します
  2. 文字列をクエリし、アプリケーション層でその長さを計算します

これらの方法の違いは、前者はデータベースで実行され、後者はアプリケーションサーバーで実行されることです。MapReduceは非常に遅く、使用が面倒な場合があるため、後者のオプションをお勧めします。

于 2013-02-01T14:28:35.883 に答える
3

空は限界です!いいえ、実際には16 MBのドキュメント用ですmongodb。これは、レコード内の文字列の最大長になる場合があります。

クエリ セットの最大長を見つけるには、次の回避策を実行できます。

  1. テキスト自体と一緒にテキストの長さを維持します。
  2. 結果セットを長さの降順で並べ替えます。
  3. 最大長を持つ最初の要素を取得します。
于 2013-02-01T13:56:30.787 に答える
3

からMongo 3.4$strLenCP集計演算子を使用して文字列の長さを取得できます。

// { a: "Hello World" }
// { a: "42" }
// { a: "Hello World!" }
db.collection.aggregate([{ $addFields: { length: { $strLenCP: "$a" } } }])
// { a: "Hello World",  length: 11 }
// { a: "42",           length: 2 }
// { a: "Hello World!", length: 12 }

$group/$maxステージを介してすべてのドキュメントから最大長を取得するには、次のようにします。

db.collection.aggregate([
  { $group: { _id: null, longest: { $max: { $strLenCP: "$a" } } } }
])
// { "_id" : null, longest: 12 }
于 2019-06-23T15:32:02.820 に答える
1

だから、これが役立つことを願っています。:-) 私は同じ問題に遭遇しました。

$response = $Mongo->yourdb->command(array(
    "mapreduce" => "yourcollection",
    "map" => new MongoCode(" function() { emit( this.groupbykey, this.thestring.length ); } "),
    "reduce" => new MongoCode(" function(k, vals) { return Math.max.apply(null, vals); } "),
    "query" => array("groupbykey" => "somevalue"),
    "out" => array("inline" => 0)
));

応答は map-reduce の結果を保持します

Array
(
    [results] => Array
        (
            [0] => Array
                (
                    [_id] => groupbykeyvalue
                    [value] => 106
                )

        )

    [counts] => Array
        (
            [input] => 7341
            [emit] => 7341
            [reduce] => 76
            [output] => 1
        )

    [timeMillis] => 189
    [timing] => Array
        (
            [shardProcessing] => 171
            [postProcessing] => 17
        )

    [shardCounts] => Array
        (
            [someshard:27017] => Array

頑張ってください。別のバリエーションが必要な場合はお知らせください。

于 2015-03-05T20:19:56.580 に答える
-2

SQL MongoDB とは異なり、フィールド自体の長さは実際にはわかりません。せいぜい、インデックスを作成するときに、フィールドが 1024 バイト未満であるかどうかを認識します。

そのため、これはおそらくクライアント側を修正する必要があるものです。ここでa を使用できます$whereが、それを行いたい場合は、これを間違っていると思います。

@Philippが述べているように、ここでand MRを使用することもできますが、ここでも間違ったことを調べている可能性があります。

MongoDB のクエリは、実際には BSON ドキュメントです。そのため、クエリ セットの最大長 (「クエリ セット」として何を定義するかによって異なります) は、(現時点では) 常に 16MB です。

多くのドライバーは、構造 (ハッシュや辞書など) を BSON にエンコードする手段を提供し、エンコードされた文字列の長さを判断してクエリのサイズを理解できるようにします。

于 2013-02-01T14:30:24.240 に答える