【问题标题】:mongoose query to return most recent versions of documents grouped by single fieldmongoose 查询返回按单个字段分组的文档的最新版本
【发布时间】:2016-12-14 19:34:12
【问题描述】:

我有这些文件,

{
    "_id" : 1,
    "fId" : "test",
    "pId" : "test",
    "url" : "A",
    "subfolder" : "a"
}

,
{
    "_id" : 3,
    "fId" : "test",
    "pId" : "test", 
    "url" : "A",
    "subfolder" : "b"
}

,
{
    "_id" : 5,
    "fId" : "test",
    "pId" : "test"
    "url" : "A",
    "subfolder" : "c"
}

,
{
    "_id" : 2,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "a"
}

,
{
    "_id" : 4,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "b"
}

,
{
    "_id" : 7,
    "fId" : "test",
    "pId" : "test",
    "url" : "A",
    "subfolder" : "d"
}

,
{
    "_id" : 8,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "d"
}

,
{
    "_id" : 9,
    "fId" : "test",
    "pId" : "test",
    "url" : "A",
    "subfolder" : "e"
}

,
{
    "_id" : 10,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "e"
}

,
{
    "_id" : 6,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "c"
}

如何编写 mongoose 查询以根据 _id 对这些文档进行排序,按子文件夹分组,并返回最近的 5 个组。

预期结果是

group 1:
[{
    "_id" : 10,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "e"
},
{
    "_id" : 9,
    "fId" : "test",
    "pId" : "test",
    "url" : "A",
    "subfolder" : "e"
}]
,
group 2:
[{
    "_id" : 8,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "d"
}
,
{
    "_id" : 7,
    "fId" : "test",
    "pId" : "test",
    "url" : "A",
    "subfolder" : "d"
}]
,

group 3:
[{
    "_id" : 6,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "c"
}
,
{
    "_id" : 5,
    "fId" : "test",
    "pId" : "test"
    "url" : "A",
    "subfolder" : "c"
}]
,
group 4:
[{
    "_id" : 4,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "b"
}
,
{
    "_id" : 3,
    "fId" : "test",
    "pId" : "test", 
    "url" : "A",
    "subfolder" : "b"
}]
,

group 5:
[{
    "_id" : 2,
    "fId" : "test",
    "pId" : "test",
    "url" : "B",
    "subfolder" : "a"
}
,
{
    "_id" : 1,
    "fId" : "test",
    "pId" : "test",
    "url" : "A",
    "subfolder" : "a"
}]

我尝试了一个查询

model.aggregate(
   [      
     {$match : {fId : "test" ,  pId : "test"}},
     {$group : {_id : "$subfolder", recording: { $push: "$$ROOT" } }},     
     {$skip : 5*(pageNumber-1)},
     {$sort : {"_id": -1}},    
     {$limit : 5 }
   ]
  )

我得到随机的5组,不是最近的,结果也不是按照_id排序的。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    您在这里误解了跳过和限制的使用。试试这个:

    model.aggregate(
       [      
         {$match : {fId : "test" ,  pId : "test"}},
         {$group : {_id : "$subfolder", recording: { $push: "$$ROOT" } }},     
         {$sort : {"recording._id": -1}},
         {$limit: 5}
       ]
      )
    

    提供示例文档的输出:

           {
        "_id" : "5",
        "recording" : [
            {
                "_id" : 9,
                "fId" : "test",
                "pId" : "test",
                "url" : "A",
                "subfolder" : "5"
            },
            {
                "_id" : 10,
                "fId" : "test",
                "pId" : "test",
                "url" : "B",
                "subfolder" : "5"
            }
        ]
    }
    {
        "_id" : "4",
        "recording" : [
            {
                "_id" : 7,
                "fId" : "test",
                "pId" : "test",
                "url" : "A",
                "subfolder" : "4"
            },
            {
                "_id" : 8,
                "fId" : "test",
                "pId" : "test",
                "url" : "B",
                "subfolder" : "4"
            }
        ]
    }
    {
        "_id" : "3",
        "recording" : [
            {
                "_id" : 5,
                "fId" : "test",
                "pId" : "test",
                "url" : "A",
                "subfolder" : "3"
            },
            {
                "_id" : 6,
                "fId" : "test",
                "pId" : "test",
                "url" : "B",
                "subfolder" : "3"
            }
        ]
    }
    {
        "_id" : "2",
        "recording" : [
            {
                "_id" : 3,
                "fId" : "test",
                "pId" : "test",
                "url" : "A",
                "subfolder" : "2"
            },
            {
                "_id" : 4,
                "fId" : "test",
                "pId" : "test",
                "url" : "B",
                "subfolder" : "2"
            }
        ]
    }
    {
        "_id" : "1",
        "recording" : [
            {
                "_id" : 1,
                "fId" : "test",
                "pId" : "test",
                "url" : "A",
                "subfolder" : "1"
            },
            {
                "_id" : 2,
                "fId" : "test",
                "pId" : "test",
                "url" : "B",
                "subfolder" : "1"
            }
        ]
    }
    

    【讨论】:

    • @Sabreena 它适用于您在问题中提供的数据...查看编辑
    • 分组很好,但我需要根据文档的 _id 排序的组。也就是说,我需要最近的两个文档,其子文件夹名称与组 1 相同。依此类推( _id : 10 是最近的文件)
    • {$match : {fId : "test" , pId : "test"}}, {$group : {_id : "$subfolder", 录音: { $push: "$$ROOT" } }}, {$sort : {"recording._id": -1}}, {$skip : 5*(pageNumber-1)}, {$limit: 5}
    • 感谢 felix,它工作得很好!!!我添加了 $skip 以向我的应用添加分页。
    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2018-04-06
    • 2019-02-13
    相关资源
    最近更新 更多