MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

FindOne pode corresponder primeiro ou por último?


Sim, você pode especificar o comportamento de .findOne() como é melhor mostrado na documentação do driver nativo. A única diferença é que na implementação do mangusto o documento "options" deve ser o "terceiro" argumento passado para o método.

Assim, você pode fornecer uma especificação de "classificação" para isso, conforme mostrado nas opções disponíveis:
Queue.findOne({ },null,{ "sort": { "_id": -1 } },function(err,doc) {

Apenas para obter informações adicionais, você pode fazer isso no shell do MongoDB com o seguinte, usando o $orderby opção de consulta:
db.collection.findOne({ "$query": { }, "$orderby": { "_id": -1 } })

Também o .findOne() pode retornar apenas um documento, mas na verdade é apenas um wrapper em torno de .find() então todos os modificadores se aplicam. O encapsulamento apenas chama .next() no cursor retornado, retorna o documento e descarta o cursor.

Este exemplo mais longo mostra diferentes maneiras pelas quais isso pode ser aplicado:
var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;


mongoose.connect('mongodb://localhost/sequence');

var queueSchema = new Schema({
  name: String,
  same: { type: String, default: "same" }
});

var Queue = mongoose.model( "Queue", queueSchema );

var count = 0;

async.series(
  [

    // Remove any documents
    function(callback) {
      Queue.remove(function(err) {
        if (err) throw err;
        callback();
      });
    },

    // Insert some new ones
    function(callback) {
      async.eachSeries(
        ["one","two","three"],
        function(item,callback) {
          var queue = new Queue({ name: item });
          queue.save(function(err,doc) {
            if (err) throw err;
            console.dir(doc);
            callback(err,doc);
          });
        },
        function(err) {
          callback(err);
        }
      );
    },

    function(callback) {
      async.whilst(
        function() { return count < 2 },
        function(callback) {
          count++
          async.series(
            [
              // findOne is just the first one
              function(callback) {
                Queue.findOne({ "same": "same" },function(err,doc) {
                  if (err) throw err;
                  console.log( "FindOne:\n%s", doc );
                  callback();
                });
              },

              // Or is sorted
              function(callback) {
                Queue.findOne(
                  { "same": "same" },
                  null,
                  { "sort": { "_id": -1 } },
                  function(err,doc) {
                    if (err) throw err;
                    console.log("FindOne last:\n%s", doc );
                    callback();
                  }
                );
              },

              // find is ordered but not singular
              function(callback) {
                async.eachSeries(
                  ["first","last"],
                  function(label,callback) {
                    var direction = ( label == "first" ) ? 1 : -1;
                    var query = Queue.find({ "same": "same" })
                      .sort({ "_id": direction })
                      .limit(1);
                    query.exec(function(err,docs) {
                      if (err) throw err;
                      console.log( ".find() %s:\n%s", label, docs[0] );
                      callback();
                    });
                  },
                  function(err) {
                    callback();
                  }
                );
              },

              // findAndModify takes a sort
              function(callback) {
                Queue.findOneAndUpdate(
                  { "same": "same" },
                  { "$set": { "same": "different" } },
                  { "sort": { "_id": -1 } },
                  function(err,doc) {
                    if (err) throw err;
                    console.log( "findOneAndUpdate:\n%s", doc );
                    callback();
                  }
                );
              }

            ],function(err) {
              callback();
            }
          );
        },
        function(err) {
          callback();
        }
      );
    }
  ],function(err) {
    console.log("done");1
    mongoose.disconnect();
  }
);