質問

2つの同じクエリは、Mongoシェルの異なるレコードとネイティブNode.jsドライバで異なるレコードを与えます:

collection.find(query).limit(1).hint(hint).toArray

collection.find(query).limit(1).hint(hint).toArray
.

ネイティブノード.jsドライバのヒントは無視され、承認された:

Node.jsドライバでの問合せからヒントを削除した場合、その結果はNode.jsドライバでヒントを使用したときと同じでした:

collection.find(query).limit(1).toArray 
.

だからの使い方に特別な規則があるかもしれません。js mongoネイティブドライバ?使い方?

役に立ちましたか?

解決

実際にはノードドライバに実装されている.hint()メソッドではありません。これを行うには、 .find()

collection.find({},{ "hint": { "a": -1 }}).limit(1).toArray(function(err,docs) {
.

実際に指定されたインデックスと一致することは、選択したインデックス順序で返された文書を取得します。おそらくより長い例:

var async = require("async"),
    mongo = require("mongodb"),
    MongoClient = mongo.MongoClient;


MongoClient.connect('mongodb://localhost/test',function(err,db) {

  async.waterfall(
    [
      function(callback) {
        db.collection('asample',function(err,collection) {
          if (err) throw err;
          callback(err,collection);
        });
      },

      function(collection,callback) {
        collection.remove(function(err,removed) {
          if (err) throw err;
          callback(err,collection);
        });
      },

      //
      function(collection,callback) {
        async.eachSeries(
          [
            { "a": 1 },
            { "a": 2 }
          ],
          function(item,callback) {
            collection.insert(item,function(err,num) {
              if (err) throw err;
              callback();
            });
          },
          function(err) {
            if (err) throw err;
            callback(err,collection);
          }
        );
      },

      function(collection,callback) {
        collection.ensureIndex({ "a": -1 },function(err,index) {
          if (err) throw err;
          console.log("Index:\n%s", index);
          callback(err,collection);
        });
      },

      function(collection,callback) {
        collection.find({},{ "hint": { "a": -1 }})
          .limit(1).toArray(function(err,docs) {
            if (err) throw err;
            console.log("Docs:\n%s", JSON.stringify( docs, undefined, 4));
            callback();

        });
      }

    ],
    function(err) {
       console.log("done");
       db.close();
    }

  );

});
.

逆指標の順序では、「2」の値が最初に返されます。

本当に、「照会」または.sort()仕様のどちらかを使用する正しい索引について言及している限り、「ヒント」を適用する必要はありません。それでそれはより良いアプローチです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top