検索

ホームページ  >  に質問  >  本文

nosql - mongoDB的排序问题

有一个List ArrayList<Long> al=new ArrayList<Long>();里面存储了从外部获取的数据的ID并且进行了排序(随机抽取的ID,按照先后放入LIST),然后把这些ID在mongoDB通过inObj.put("_id", new BasicDBObject("$in", list));进行in查询,获取后的结果并不和LIST中ID的顺序一样,搜索了一下,有文章说不指定排序的话,mongodb会按照$natural进行排序,但是我测试了一下,并不是这样。
现在问题是怎么才能让mongodb按照list的排序获取结果呢

大家讲道理大家讲道理2766日前725

全員に返信(4)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-21 10:58:29

    これは素晴らしい質問です。実際、あなたがチェックした記事は間違っていません。順序を指定しない場合は、自然な順序に従って配置されます。ただ、この自然ソートとは、_id的自然排序去排。你的list只是一个查询条件,就相当于x > max AND x < min指定的一个查询范围,跟排序完全没有关系,不论是什么数据库系统,都会在你指定的这个listの範囲内のデータを見つけた後、独自のソート方法に従ってデータをソートすることを意味します。

    私の提案は、値を取得した後もこのメソッドを使用して、Java プログラムを自分でループし、ソートされた配列を実行することです。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-21 10:58:29

    @joyqi の発言は完全に正しくありません。MongoDB の自然な並べ替え (つまり、$natural フィールドによる並べ替え) は、_id フィールドによる並べ替えとは異なります。自然な並べ替えは、データ ファイル内でデータが編成される順序に基づいています。

    たとえば、次のステートメントを使用してデータを挿入すると、クエリを説明してインデックスがどのように使用されるかを確認できます。 リーリー

    a フィールドにインデックスを付けない場合、次の結果が得られます。これは自然な並べ替えの結果です。 リーリー

    現時点ではMongoDBはテーブルクエリなので、データがスキャンされて条件を満たしていれば返されるリストに追加されます。したがって、それは自然な順序で行われます。

    そしてインデックスを追加して再度確認すると、次の結果が得られます

    リーリー

    インデックスによってクエリを実行する場合、この例では、インデックス内の複数のデータをチェックすることと同等であるため、結果が 1 であることと a が 2 であることに従って分離されていることがわかります。 a の範囲は [1,1] と [2,2] です。これら 2 つの時間は論理的にシリアルです。最初に [1,1] のデータをチェックし、次に [2,2] のデータをチェックします。したがって、ここでの a は次のようになります。 1 と 2 は分離されています。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-21 10:58:29

    私は mongodb を使用したことがありませんが、この質問に対する答えは他のリレーショナル データベースと同じだと思います。このような ID をリレーショナル データベースに挿入し、その ID が主キーである場合、主キー自体がクラスター化インデックスであるため、データベースは ID の値に従って自動的に並べ替えます。これを実現するのは非常に簡単です。 ID を自分で生成せず、Mongodb に自動的に増加する ID を生成させます。これにより、挿入時にこの自動増加する値に基づいて並べ替えが行われ、それを読み取るときにも挿入順に読み取られます。 。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-21 10:58:29

    検索してランク付けしましょう!

    返事
    0
  • キャンセル返事