Ja, Sie können das Verhalten von .findOne()
wie am besten in der nativen Treiberdokumentation gezeigt wird. Der einzige Unterschied besteht darin, dass in der Mongoose-Implementierung das "options"-Dokument muss das "dritte" Argument sein, das an die Methode übergeben wird.
Sie können also eine "Sortierung" angeben, wie in den verfügbaren Optionen gezeigt:
Queue.findOne({ },null,{ "sort": { "_id": -1 } },function(err,doc) {
Nur für zusätzliche Informationen können Sie dies in der MongoDB-Shell mit dem folgenden tun, indem Sie den $orderby
Abfrageoption:
db.collection.findOne({ "$query": { }, "$orderby": { "_id": -1 } })
Auch die .findOne()
-Methode kann nur ein Dokument zurückgeben, aber es ist wirklich nur ein Wrapper um .find()
also gelten alle Modifikatoren. Der Wrapping ruft einfach .next()
auf auf dem zurückgegebenen Cursor, gibt das Dokument zurück und verwirft den Cursor.
Dieses längere Beispiel zeigt verschiedene Möglichkeiten, wie dies angewendet werden kann:
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();
}
);