【发布时间】:2015-07-26 20:27:36
【问题描述】:
我正在构建一个聊天应用程序,它应该从 MongoDB 检索所有新消息,并分组到对话中。但是每条消息都应该有一个新的“is_self”字段
编辑: 'is_self' 字段包含一个布尔值,表示消息是否来自用户。
太假了:
is_self: {$cond: {if: {message.sender == MYID)}, then: true, else: false}
假设我有消息模型
var MessageSchema = new Schema({
conversation_id:{type: mongoose.Schema.ObjectId, ref: 'Conversation', required: true},
message: {type: String, required: true},
sender: {type: mongoose.Schema.ObjectId, ref: 'User'},
created: {type: Date, default: Date.now},
read: {type: Boolean, default: false}
});
还有一个对话模型
var ConversationSchema = new Schema({
from: {type: mongoose.Schema.ObjectId, ref: 'User', required: true},
to: {type: mongoose.Schema.ObjectId, ref: 'User', required: true},
last_changed: {type: Date, default: Date.now},
created: {type: Date, default: Date.now}
});
现在我尝试做一个聚合,加载所有在 conversation_id 数组中创建的消息 > last_checked date...
所以它看起来像这样:
mongoose.model("Message").aggregate([
// First find all messages
{
$match: {
$and: [{conversation_id: {$in: idArray}}, {created: {$gt: lastChecked}}]
}
},
// Add is self field
{
$group: {
_id: $_id,
$is_self: {
$cond: {'if(message.sender == MYID then true else false': '??'}
}
}
},
// Sort by date
{$sort: {created: -1}},
// Then group by conversation
{
$group: {
_id: '$conversation_id',
messages: {
$push: '$$ROOT'
},
}
}
// TODO: find users for unknown conversation
/*,
{
$project: {
user: {
$or: [{conversation_id: {$in: knownConversations}}]
}
}
}*/
])
我尝试使用 $cond 和 if / else 语句,但 Mongo 不允许这样做..
谢谢!
【问题讨论】:
标签: node.js mongodb mongoose mongodb-query aggregation-framework