sql >> データベース >  >> NoSQL >> MongoDB

mongoDBを検索エンジンとして使用する方法は?

    2mlnレコードのMongoDB3.4rc

    インデックスのないコレクションで別のクエリを実行しているため、コードの問題は「query」パラメータに関連していると思います。

    更新(結果/統計を含む):

    db.runCommand( { dropDatabase: 1 } )
    
    db.createCollection("places"); 
    
    db.places.createIndex( { "locs.loc.coordinates" : "2dsphere" } )
    
    
    function randInt(n) { return parseInt(Math.random()*n); }
    function randFloat(n) { return Math.random()*n; }
    
    for(var j=0; j<10; j++) {  
      print("Building op "+j);
      var bulkop=db.places.initializeOrderedBulkOp() ;
      for (var i = 0; i < 1000000; ++i) {
        bulkop.insert(    
          {
            locs: [
              {
                loc : { 
                  type: "Point", 
                  coordinates: [ randFloat(180), randFloat(90) ] 
                }
              },
              {
                loc : { 
                  coordinates: [ randFloat(180), randFloat(90) ] 
                }
              }
            ]
          }  
        )
      };
      print("Executing op "+j);
      bulkop.execute();
    }
    

    これはクエリです:

    db.runCommand(
       {
         geoNear: "places",
         near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
         spherical: true
       }
    )
    

    58ms:

    2ミリ秒の2回目の実行:

    db.runCommand(
       {
         geoNear: "places",
         near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
         spherical: true,
         query: { category: "private" }
       }
    )
    

    156996ms:

    「カテゴリ」インデックスを作成した後:{locs.loc.coordinates: "2dsphere"、category:1}

    13562ms:

    更新: 「maxDistance」を追加することで、 396msを実行できます vs 6863ms

    db.runCommand(
       {
         geoNear: "places",
         near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
         spherical: true,
         query: {category: "private"},
         maxDistance: 1000000
       }
    )
    

    maxDistance:1000000

    "stats" : {
        "nscanned" : NumberInt(107820), 
        "objectsLoaded" : NumberInt(1), 
        "avgDistance" : 938598.1782650856, 
        "maxDistance" : 938598.1782650856, 
        "time" : NumberInt(396)
    }
    

    「maxDistance」なし:

    db.runCommand(
       {
         geoNear: "places",
         near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
         spherical: true,
         query: {category: "private"}
       }
    )
    
    "stats" : {
        "nscanned" : NumberInt(2023916), 
        "objectsLoaded" : NumberInt(6), 
        "avgDistance" : 3013587.205365039, 
        "maxDistance" : 4263919.742779636, 
        "time" : NumberInt(6863)
    }
    

    出典: https://www.mongodb .com / blog / post / geospatial-performance-improvements-in-mongodb-3-2

    さらに、クエリで「座標の配列」を使用している場合、1つのオブジェクト(通常)には1つのジオロケーションポイントがあるため、役に立たないと思います。

    最適化するもう1つの方法は、「 geoWithin」を作成することです。 「は「距離」で並べ替えていないので(「最も投票されたレストラン」で並べ替えたい場合があります)。シナリオによって異なります。




    1. 文字列としての流星の戻り値

    2. アプリケーションキャッシュv.s.休止状態の第2レベルのキャッシュ、どちらを使用しますか?

    3. Mongo db c#ドライバー-コレクションにIDで参加する方法は?

    4. 集計フレームワークを使用して他のフィールドを含めずに_idを除外する方法