Node.js中的Mongo DB查询

时间:2019-02-23 20:15:14

标签: node.js mongodb

我想创建一个查询,找到我找到的最后一个插入物。

这是我在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属性可以作为参考点吗?

我是一个初学者,所以我有太多问题。对不起。

1 个答案:

答案 0 :(得分:1)

在猫鼬中,您要么:

  • 使用带有回调的查询,如果传入回调函数,Mongoose将异步执行查询并将结果传递给回调
Info.find({},callbackFunc);
  • 使用没有回调的查询,这使您可以链接多个查询。在链的末尾,添加.exec(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