我想创建一个查询,找到我找到的最后一个插入物。
这是我在Infos集合中的数据集。
{
"_id": "5c7114339624d8dd041bae18",
"user_id": "AHK",
"gps": "gps information",
"timestamp": "2010-05-30T20:07:35.000Z",
"__v": 0
},
{
"_id": "5c7114bde3075ae0b38ec0bc",
"user_id": "AHK",
"gps": "gps information2",
"timestamp": "2010-05-30T20:07:35.000Z",
"__v": 0
},
{
"_id": "5c7114c2e3075ae0b38ec0bd",
"user_id": "AHK",
"gps": "gps information3",
"timestamp": "2010-05-30T20:07:35.000Z",
"__v": 0
}
例如,我要选择gps值为“ gps information3”的数据。
这是此数据库中最后插入的查询。因此,我如下创建查询以选择此项。
router.get('/infos/gps/:userid/recent',function(req,res){
var temp = Info.find({user_id: req.params.userid}, function(err, info){
if(err) return res.status(500).json({error: err});
if(!info) return res.status(404).json({error: 'user not found in Info collections.'});
}).sort( {"_id": -1} ).findOne(function(err2,info2){
if(err2) return res.status(500).json({error: err2});
if(!info2) return res.status(404).json({error: 'findOne error'});
console.log(info2.user_id +" "+info2.gps+" "+info2.timestamp);
res.json(info2);
});
});
有效。 但是我不明白流程。我知道Nodejs是异步的。并且具有回调功能。
我猜想,首先调用find函数,然后在返回find函数的结果时调用sort函数,最后在返回sort函数时调用findOne函数。
但是我认为它不是异步的。 因为我认为排序功能会在返回find函数的结果之前继续进行。
你能告诉我答案是什么吗?
此外,让我知道是否有一种方法可以使此查询更好。
最后,在按时间排序时,mongodb的_id属性可以作为参考点吗?
我是一个初学者,所以我有太多问题。对不起。
答案 0 :(得分:1)
在猫鼬中,您要么:
Info.find({},callbackFunc);
Info.find({user_id: req.params.userid}).sort({"_id": -1}).findOne().exec(callbackFunc)
回调函数如下:
function callbackFunc (err,docs) {
if (err) {
console.log(err); // do something
}
if (!doc) {
// do something else
}
console.log(doc); //do the main thing
}
坦率地说,我不知道您发布的代码是如何工作的,但如果可以,肯定不支持。 https://mongoosejs.com/docs/queries.html
关于为什么可以按id排序并按时间顺序对其进行排序的原因,这是因为在MongoDB中,如果将主键定义为ObjectId,则可以免费获得时间戳。这是因为12字节的ObjectId类型包含4字节的时间分量。 http://www.syntaxsuccess.com/viewarticle/sorting-by-objectid-in-mongodb