如何将消息查询限制/过滤到最新消息

时间:2015-01-16 18:32:51

标签: angularjs mongodb

我正在构建一个消息收件箱,它几乎全部设置好了!在所有消息的列表中,它确实包含所有消息。我希望这只是一个对话列表。因此,它不是显示来自人A的10条消息,而是仅显示来自人A的最新消息。它也必须是OR条件,其中接收者是人A或人B.发送者也是如此。 。发件人是A人或B人。

<div ng-repeat="message in messages.messages" ng-class="{unread: !message.read}">
         <h5>{{message.sender}}</h5>
        <a href="#view-message" data-toggle="modal" data-dismiss="modal" ng-click="viewMessage(message)">{{message.message.message}}</a>
        <i>Sent {{timeAgo(message.sent)}}</i>
</div>

这是获取每条消息而不是每次会话的当前后端。

db.collection('messages', function (err, collection) {
    collection.find({
        receiver: req.user._id
    }).sort({
        date: -1
    }).toArray(function (err, docs) {
        if (err) {
            console.log('Error getting messages', err);
            throw err;
        }
        if (docs) {
            console.log('Found some messages');
            console.log(docs);
            res.send({
                messages: docs
            });
        } else {
            console.log('Didnt find messages');
            res.send({
                messages: []
            });
        }
    })
});

1 个答案:

答案 0 :(得分:1)

限制很简单,请使用limit (docs)。由于limit修改find返回的光标(就像sort),因此不需要回调:

collection.find({...}).sort({...}).limit(1).toArray(...);

您正在寻找的OR逻辑由$or query operator (docs)提供。 $ is a special character within MongoDB:它始终为运算符(查询或更新)添加前缀,但将其用作array positional operator as projection的情况除外。无论如何,你正在寻求的是:

{
    $or: [
        {receiver: req.user._id},
        {sender: req.user_id}
    ]
}

$or逻辑运算符(以及$and$nor,但不是$not)会获取您通常会将其视为简单查询的对象数组:即类似$or:[{...},{...},{...}]

现在把它们放在一起:

db.collection('messages', function (err, collection) {
    collection.find({
        $or: [
            {receiver: req.user._id},
            {sender: req.user_id}
        ]
    }).sort({
        date: -1
    }).limit(1).toArray(function (err, docs) {
        if (err) {
            console.log('Error getting messages', err);
            throw err;
        }
        if (docs) {
            console.log('Found some messages');
            console.log(docs);
            res.send({
                messages: docs
            });
        } else {
            console.log('Didnt find messages');
            res.send({
                messages: []
            });
        }
    })
});

或者,find (docs)可以接受排序和限制选项,而不是使用函数链语法:

collection.find({
    $or: [
        {receiver: req.user._id},
        {sender: req.user_id}
    ]
},{
    sort:{
        date: -1
    },
    limit: 1
}).toArray(...)