我的数据库中有收藏集,
[
{
"groupName" : "testName",
"participants" : [
{
"participantEmail" : "test@test.com",
"lastClearedDate" : 12223213123
},
{
"participantEmail" : "test2@test.com",
"lastClearedDate" : 1234343243423
}
],
"messages" : [
{
"message":"sdasdasdasdasdasd",
"time":22312312312,
"sender":"test@test.com"
},
{
"message":"gfdfvd dssdfdsfs",
"time":2231231237789,
"sender":"test@test.com"
}
]
}
]
这是组的集合,其中包含该组中的所有参与者和消息。 消息中的时间字段为时间戳。
我想获取组内的所有消息,这些消息在给定日期之后发布并按日期分组。 我写了以下代码,
ChatGroup.aggregate([
{ $match: { group_name: groupName } },
{ $unwind: "$messages" },
{ $match: { "messages.time": { $gte: messagesFrom } } },
{
$project: {
_id: 0,
y: {
$year: {
$add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
}
},
m: {
$month: {
$add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
}
},
d: {
$dayOfMonth: {
$add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
}
}
}
},
{
$group: {
_id: {
year: "$y",
month: "$m",
day: "$d"
},
messages: { $push: "$messages" },
count: { $sum: 1 }
}
}
]).then(
group => {
console.log("length of messages", group);
resolve(group);
},
err => {
console.log(err);
}
);
});
我得到以下输出,
[
{
"_id": {
"year": 50694,
"month": 9,
"day": 5
},
"messages": [],
"count": 3
},
{
"_id": {
"year": 50694,
"month": 8,
"day": 27
},
"messages": [],
"count": 1
},
{
"_id": {
"year": 50694,
"month": 8,
"day": 26
},
"messages": [],
"count": 10
}
]
我没有收到消息,但计数正确。 另外,结果中显示的时间也不正确,例如年,日期和月。 Mongo版本是3.2。
我参考了groupby并从mongodb推送了文档,以及有关mongo group by的其他stackoverflow问题。
我在做什么错了?
答案 0 :(得分:1)
在messages
中添加$project
{
$project: {
_id: 0,
messages : 1,
.........
},
}
答案 1 :(得分:1)
您的时间戳已经以秒为单位。因此,您无需将它们乘以1000即可将其转换为毫秒。
所以您的最终查询应该是这样的
ChatGroup.aggregate([
{ "$match": {
"group_name": groupName,
"messages.time": { "$gte": messagesFrom }
}},
{ "$unwind": "$messages" },
{ "$match": { "messages.time": { "$gte": messagesFrom }}},
{ "$group": {
"_id": {
"year": { "$year": { "$add": [new Date(0), "$messages.time"] }},
"month": { "$month": { "$add": [new Date(0), "$messages.time"] }},
"day": { "$dayOfMonth": { "$add": [new Date(0), "$messages.time"] }}
},
"messages": { "$push": "$messages" },
"count": { "$sum": 1 }
}}
])