我正在构建一个消息收件箱,它几乎全部设置好了!在所有消息的列表中,它确实包含所有消息。我希望这只是一个对话列表。因此,它不是显示来自人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: []
});
}
})
});
答案 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(...)