我想只聚合其中' sessionUsername'是在'到'他/她还将他/她的消息视图设置为view.inbox:true& view.archive:false& view.bin:假..
(满足这些参数的文档通过$或messagingQuery进一步过滤)
为什么生成的文档会排除'到'中存在的任何其他用户的值。阵列吗
我有一个嵌入式文档的架构结构,如下所示:
var MessageSchema = new Schema({
from : [UserMessageSchema],
to : [UserMessageSchema],
message : String,
updated : Date
});
var UserMessageSchema = new Schema({
user : { "type": Schema.ObjectId, "ref": "User" },
username : String,
view : {
inbox : Boolean,
outbox : Boolean,
archive : Boolean,
bin : Boolean
}
updated : Date
});
以及如下所示的聚合查询:
Models.Messages.aggregate([
// Match documents
{ "$match": {
"to": {
"$elemMatch": {
"username": sessionUsername,
"view.inbox": true,
"view.archive": false,
"view.bin": false
}
},
"$or": messagingQuery
}},
// Unwind to de-normalize
{ "$unwind": "$to" },
// Match the array elements
{ "$match": {
"to.username": sessionUsername,
"to.view.inbox": true,
"to.view.archive": false,
"to.view.bin": false
}},
// Group back to the original document
{ "$group": {
"_id": "$_id",
"from": { "$first": "$from" },
"to": { "$push": "$to" },
"message": { "$first": "$message" },
"updated": { "$first": "$updated" }
}},
// Sort by updated, most recent first (descending)
{"$sort": {"updated": -1}}
], function (err, docs) {
答案 0 :(得分:0)
感谢@NeilLunn指出答案:在$ unwind之后,第二个$匹配排除了不匹配第二个$ match的字段。
这是一个find():
Models.Messages.find(
{
"to": {
"$elemMatch": {
"username": sessionUsername,
"view.inbox": true,
"view.archive": false,
"view.bin": false
}
},
"$or": messagingQuery
}
).sort([['updated','descending']]).exec(function (err, docs) {