代码之家  ›  专栏  ›  技术社区  ›  user3142695

获取$group by之后的最新文档

  •  2
  • user3142695  · 技术社区  · 6 年前

    我用的是 official MongoDB driver 对于node.js。

    这就是我的消息数据的结构。如您所见,每个帖子都有一个时间戳、一个用户ID和主题的ID。

    [
      {
        "_id" : ObjectId("5b0abb48b20c1b4b92365145"),
        "topicId" : "XN7iqmCFD4jpgJZ6f",
        "timestamp" : 1527429960,
        "user" : "5b0869636f4e363e300d105a",
        "content" : "lorem ipsum"
      }    
    ]
    

    现在我需要检查是否有主题,哪个最新的帖子(=highest timestamp)与我自己的ID不匹配。 有了这个,我知道哪个主题有了新的答案(这不是我自己的帖子)。

    所以我从这个开始:

    db.messages.find({
      $query: { 
        user: { $ne: "myUserId" }
      },
      $orderby: { 
       timestamp: -1 
      }
    }).limit(1).toArray()
    

    我的问题是,我不知道如何用杀顶剂对我的查询进行分组。不知怎么的,在我的尝试中似乎有错误的语法。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ashh    6 年前

    您必须使用聚合来分组 topicId 然后 $sort 按时间排序,然后 $limit 限制查询

    db.messages.aggregate([
        { $match: { user: { $ne: "myUserId" } }},
        { $group: {
            _id: "$topicId",
            timestamp: { $first: "$timestamp"},
            user: { $first: "$user" },
            content: { $first: "$content" }
        }},
        { $sort: { timestamp: -1 } },
        { $limit: 1 }
    ])
    
        2
  •  0
  •   Sanjay Vemuri    6 年前

    使用聚合管道来执行此操作,而不是查找。

    1)$match$ne:“我的用户ID”

    2)$排序时间戳:-1

    3)$组除草剂$第一

    我以前写过的一个查询示例。

    { "$match": { $and: [ {'latestTimeStamp': { "$gte": new Date('3/11/2018') }}, {'latestTimeStamp': { "$lte": new Date('4/12/2018') }} ]}  },
    
    
                                { $unwind: '$latestSev'},
    
    
                                { $sort: {'latestSev.sevRating': -1}},
    
    
                                { $group:{  _id:{_id:'$_id', latestTimeStamp:'$latestTimeStamp', latestLikeli:'$latestLikeli', latestControl:'$latestControl', residualRatingArray:'$residualRatingArray'}, 
    
    
                                            latestMaxImpName: {$first:'$latestSev.impName'} ,
    
                                            latestMaxSevRating: {$first:'$latestSev.sevRating'}
                                        }
    
                                }