node.js - 猫鼬排序子文档并返回子文档
问题描述
persons
收藏:
{
name: "jhon",
msgs: {
chat_one: [
{id: 1234, msg: "hi", date: "18/05/2018"},
{id: 1234, msg: "hello", date: "19/05/2018"}
],
chat_two: [
{id: 1234, msg: "hi", date: "18/05/2018"},
{id: 1234, msg: "hello", date: "19/05/2018"}
]
}
}
如何使用 mongoose 进行查询并获取如下数据。
- 按日期排序。
- 并返回
chat_one
一个人的消息。
{ chat_one: [ {id: 1234, msg: "hello", date: "19/05/2018"}, {id: 1234, msg: "hi", date: "18/05/2018"} ] }
解决方案
一种方法是通过这样的聚合:
db.collection.aggregate([
{ $match: { name: "jhon" }},
{ $unwind: "$msgs" },
{ $sort: { "msgs.date": -1 }},
{ $group: { _id: "$name", msgs: { $addToSet: "$msgs" }}},
{ $project: { _id: 0 }}
])
你可以看到它在这里工作
我们的想法是$match
先输入名称,然后再$unwind
输入$sort
日期,然后再$group
获得$project
所需的输出。
推荐阅读
- google-cloud-platform - 用于 DataFlow 和 DataPrep 的 ZONE_RESOURCE_POOL_EXHAUSTED
- r - R Bass Diffusion 使用 nls() 和预测器
- objective-c - 如何从 Objective-C 调用 Swift 可变参数方法?
- sql - 从 LEFT JOIN 中仅检索一条记录
- php - 在PHP中获取给定中心纬度/经度的圆的外部坐标
- c++ - 模板类的不同对象的通用接口
- ios - iOS - 如何使用自定大小的 CollectionView 单元格设置锚点以调整换行符的间距
- c# - 同时获取同一个 azure blob 的租约
- salesforce - 如果现有记录然后根据您更新某些字段创建新记录,如何在帐户对象上编写触发器?
- java - Map 的 putIfAbsent 实现中的冗余分配