sql >> Database teknologi >  >> NoSQL >> MongoDB

Kan findOne match først eller sidst?

Ja, du kan angive adfærden for .findOne() som det bedst vises i den oprindelige driverdokumentation. Den eneste forskel er, at i mongoose-implementeringen skal dokumentet "optioner" være det "tredje" argument, der sendes til metoden.

Så du kan levere en "sorterings"-specifikation til dette som vist i de tilgængelige muligheder:

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

Bare for yderligere information kan du gøre dette i MongoDB-skallen med følgende ved at bruge $orderby forespørgselsindstilling:

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

Også .findOne() metoden returnerer muligvis kun ét dokument, men det er i virkeligheden kun en indpakning omkring .find() så alle modifikatorerne gælder. Indpakningen kalder bare .next() på den returnerede markør, returnerer dokumentet og kasserer markøren.

Dette længere eksempel viser forskellige måder, hvorpå dette kan anvendes:

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. Minimongo understøtter endnu ikke $-operatør i projektioner

  2. Forberedelse af en MongoDB-server til produktion

  3. [Infographic] Sammenligning af Cassandra vs. MongoDB

  4. Hvordan udtrækker du et tidsstempel fra et MongoDB ObjectId i Spring Data MongoDB?