MongoDB使用选择字段聚合查询

时间:2016-01-11 11:37:14

标签: mongodb

我想制作聊天系统,还需要获取用户的最后消息。我也提供查询,但它只返回用户的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
}

1 个答案:

答案 0 :(得分:3)

你是正确的,但你遗漏了一些关于 $mongo object Id

的事情
  
    

在MongoDB中,存储在集合中的文档需要一个唯一的_id字段作为主键。

  

因此,当您运行汇总查询$group_id密钥创建from时,但在您的文档结构中,from有两个文档具有相同的ObjectId因为结果返回第一个匹配标准。这仅返回"msg" : "Hello!","msg" : "Shu che ela!"首先插入的文档首先返回。

所以应该像这样{"$group":{"_id":"$_id","msg":{"$first":"$msg"}}}更改你的聚合,你将得到两份文件。