我想制作聊天系统,还需要获取用户的最后消息。我也提供查询,但它只返回用户的userId。所以请帮助我,谢谢
数据库:
/* 1 */
{
"_id" : ObjectId("56937df0418a6afab248616d"),
"to" : ObjectId("56728051d4b426be03de18f2"),
"from" : ObjectId("568e402eaecfa53282f60d17"),
"msg" : "Hello!",
"cd" : ISODate("2016-01-11T10:03:28.139Z"),
"type" : "other",
"ir" : 0
}
/* 2 */
{
"_id" : ObjectId("56937e01418a6afab248616e"),
"to" : ObjectId("568e402eaecfa53282f60d17"),
"from" : ObjectId("56728051d4b426be03de18f2"),
"msg" : "Hi!",
"cd" : ISODate("2016-01-11T10:03:45.588Z"),
"type" : "other",
"ir" : 0
}
/* 3 */
{
"_id" : ObjectId("56937e45418a6afab248616f"),
"to" : ObjectId("56728051d4b426be03de18f2"),
"from" : ObjectId("568e402eaecfa53282f60d17"),
"msg" : "Shu che ela!",
"cd" : ISODate("2016-01-11T10:04:53.280Z"),
"type" : "other",
"ir" : 0
}
查询:
db.getCollection('chat_message').aggregate( [
{
$match: {
ir: 0,
$or : [
{"to" : ObjectId("56728051d4b426be03de18f2")}
]
}
},
{ $group: { _id: "$from" } },
])
我运行此查询但未获得我想要的结果
要求出来:
/* 1 */
{
"result" : [
{
"_id" : ObjectId("568e402eaecfa53282f60d17"),
"msg" : "Shu che ela!"
}
],
"ok" : 1.0000000000000000
}
答案 0 :(得分:3)
你是正确的,但你遗漏了一些关于 $mongo object Id
的事情在MongoDB中,存储在集合中的文档需要一个唯一的_id字段作为主键。
因此,当您运行汇总查询$group
为_id
密钥创建from
时,但在您的文档结构中,from
有两个文档具有相同的ObjectId
因为结果返回第一个匹配标准。这仅返回"msg" : "Hello!",
或"msg" : "Shu che ela!"
首先插入的文档首先返回。
所以应该像这样{"$group":{"_id":"$_id","msg":{"$first":"$msg"}}}
更改你的聚合,你将得到两份文件。