sql >> Database >  >> NoSQL >> MongoDB

Kan findOne als eerste of als laatste overeenkomen?

Ja, u kunt het gedrag van .findOne() zoals het beste wordt weergegeven in de oorspronkelijke driverdocumentatie. Het enige verschil is dat bij de implementatie van mangoesten het document "opties" moeten het "derde" argument zijn dat aan de methode wordt doorgegeven.

U kunt hier dus een "sorteer" specificatie aan geven zoals weergegeven in de beschikbare opties:

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

Alleen voor aanvullende informatie kunt u dit doen in de MongoDB-shell met het volgende, met behulp van de $orderby zoekoptie:

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

Ook de .findOne() methode retourneert misschien maar één document, maar het is eigenlijk gewoon een wrapper rond .find() dus alle modifiers zijn van toepassing. De verpakking roept gewoon .next() . aan op de geretourneerde cursor, geeft het document terug en verwijdert de cursor.

Dit langere voorbeeld toont verschillende manieren waarop dit kan worden toegepast:

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. retourneert alleen het laatste niveau van de ingesloten eigenschap waarnaar in een document wordt gezocht

  2. Voeg optionele queryparameter toe met behulp van spring data mongodb-repository

  3. MongoDB Aggregation-opdracht naar Java-code

  4. Hoe kunnen we Paginering voor Mongodb Collection implementeren met behulp van mongoTemplate