汇总猫鼬

时间:2016-03-29 06:09:22

标签: node.js mongodb mongoose aggregation-framework

我正在为我的项目使用MongoDB和Mongoose。 我有一个消息集合,用于在客户和管理员池之间存储消息。客户生成问题,管理员生成回复。数据结构如下:

{
    "_id" : ObjectId("56fa0b9c98868ee59a6981f8"),
    "from" : ObjectId("56c3623801582ce05d5fe870"),
    "value" : "Question 1???",
    "date" : ISODate("2016-03-29T04:59:08.799Z"),
},
{
    "_id" : ObjectId("56fa0bb198868ee59a6981f9"),
    "from" : ObjectId("56f90ce398868ee59a6981ee"),
    "value" : "Question A?",
    "date" : ISODate("2016-03-29T04:59:29.769Z"),
},
{
    "_id" : ObjectId("56fa0bcf2c8db147579f5a51"),
    "to" : ObjectId("56c3623801582ce05d5fe870"),
    "from" : ObjectId("56c167d1912bdff65bc0644b"),
    "value" : "Answer 1",
    "date" : ISODate("2016-03-29T04:59:59.320Z"),
}

在上面的示例中,我们有3条消息:

  • 客户ID = ... 870问一个问题" 1"
  • 客户ID = ... 1ee问一个问题" A"
  • Admin Id = ... 44b回答问题" 1"来自客户ID = ... 870
  • 问题" A"来自客户无法回答

我需要列出并计算未回答的问题。

更新: 这足以让我获得#34;客户(而不是管理员)发送的消息列表,而不是t稍后会有管理员回复"

从上一个查询中我已经有一个Admin Ids(objectIdArray)数组,所以我可以检查一条消息是否来自一个带有以下表达式的管理员:

{from: {$in: objectIdArray}}

我试图用一个查询来解决所有问题:

Custmsg.aggregate([
    {$match: { $and: [ {archiveDate: {$exists: false}} ] } },
    {$group: { _id: {'from': '$from', 'to': '$to'},
                info: {
                        $push: {    lastMessage: '$date',
                                    lastValue: '$value',
                                    to: '$to'
                                }
                        }
            }
    },
    {$sort: {lastMessage: -1}}
])

得到这个结果:

[
   {
      "_id":{
         "from":"56c167d1912bdff65bc0644b",
         "to":"56c3623801582ce05d5fe870"
      },
      "info":[
         {
            "lastMessage":"2016-03-29T04:59:59.320Z",
            "lastValue":"Answer 1",
            "to":"56c3623801582ce05d5fe870"
         }
      ]
   },
   {
      "_id":{
         "from":"56f90ce398868ee59a6981ee"
      },
      "info":[
         {
            "lastMessage":"2016-03-29T04:59:29.769Z",
            "lastValue":"Question A?"
         }
      ]
   },
   {
      "_id":{
         "from":"56c3623801582ce05d5fe870"
      },
      "info":[
         {
            "lastMessage":"2016-03-29T04:59:08.799Z",
            "lastValue":"Question 1???"
         }
      ]
   }
]    

但我不知道如何完成。 是否可以在单个查询中执行此操作,或者您将如何执行此操作?

0 个答案:

没有答案