sql >> Databasteknik >  >> NoSQL >> MongoDB

Kan findOne matcha först eller sist?

Ja, du kan specificera beteendet för .findOne() som bäst visas i den inbyggda förardokumentationen. Den enda skillnaden där är att i mongoose-implementeringen måste dokumentet "alternativ" vara det "tredje" argumentet som skickas till metoden.

Så du kan tillhandahålla en "sorterings"-specifikation till detta som visas i de tillgängliga alternativen:

Queue.findOne({ },null,{ "sort": { "_id": -1 } },function(err,doc) {

Bara för ytterligare information kan du göra detta i MongoDB-skalet med följande, med hjälp av $orderby frågealternativ:

db.collection.findOne({ "$query": { }, "$orderby": { "_id": -1 } })

Även .findOne() metod kan bara returnera ett dokument, men det är egentligen bara ett omslag runt .find() så alla modifierare gäller. Omslaget anropar bara .next() på den returnerade markören, returnerar dokumentet och förkastar markören.

Detta längre exempel visar olika sätt på vilka detta kan tillämpas:

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


  1. Cloudera Impala:Realtidsfrågor i Apache Hadoop, på riktigt

  2. Mongoose findOneAndUpdate och runValidators fungerar inte

  3. mongodb mongoose enhet av maxDistance

  4. Objekt är inte giltiga som en React underordnad data från MongoDB