Frage

Zwei gleiche Abfragen geben mir unterschiedliche Datensätze in der Mongo-Shell und im nativen node.js-Treiber:

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

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

Ich nahm an, dass der Treiberhinweis im nativen node.js ignoriert wird und genehmigt wurde:

Als ich den Hinweis aus der Abfrage im Treiber von node.js entfernte, war das Ergebnis dasselbe wie bei der Verwendung des Hinweises im Treiber von node.js:

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

Vielleicht gibt es dafür eine Sonderregel Verwenden Sie den Hinweis im nativen Mongo-Treiber von node.js?Wie benutzt man es?

War es hilfreich?

Lösung

Es gibt tatsächlich keine .hint() Methode, die im Knotentreiber implementiert ist.Um dies zu tun, geben Sie „Optionen“ für die Cursorerstellung an .find():

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

Vorausgesetzt, dass dieser tatsächlich mit einem angegebenen Index übereinstimmt, werden die Dokumente in der ausgewählten Indexreihenfolge zurückgegeben.Vielleicht ein längeres Beispiel:

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();
    }

  );

});

Wobei in umgekehrter Indexreihenfolge der Wert „2“ zuerst zurückgegeben wird.

Tatsächlich sollte „Hinweis“ jedoch nicht angewendet werden müssen, solange entweder Ihre „Abfrage“ oder .sort() Geben Sie in der Spezifikation den korrekten zu verwendenden Index an.Das wäre also der bessere Ansatz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top