收藏
回答

云函数,请问如何给获取到集合结果后给数组字段排序?

假设通过 db.collection('xxx').doc(1).get() 得到以下数据:

{
   _id1,
   title1: 'tt',
   title2: 'tt',
   list: [{
       id: 1,
       date: '2020-06-18'
      },{
        id2,
       date: '2020-06-28'
   }]
}


然后我想在得到这个数据之后在原数据的基础上将list按date倒序排序得到以下结果

{
   _id1,
   title1: 'tt',
   title2: 'tt',
   list: [{
        id: 2,
       date: '2020-06-28'
      },{
       id1,
       date: '2020-06-18'
   }]
}


我尝试将查询语句改成这样:

                    db.collection('xxx').aggregate()
            .match({
                _id: 1
            })
            .unwind('$list')
            .sort({
                'list.date'-1
            })
            .group({
                _id: '$_id',
                title1: $.first('$title1'),
                title2: $.first('$title2'),
                list: $.push('$list')
            })
            .end()

这样查之后,确实可以得到我想要的结果,但是有个问题是,

我的list字段是动态的,会有为空数组的情况,按照上面的写法,如果list为空数组,

那么最后连_id、title1、title2这三个字段都没了,请问下这个查询语句该怎么改才能达到想要的效果?

回答关注问题邀请回答
收藏

2 个回答

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2020-06-18
    unwind({
        path: '$list',
        preserveNullAndEmptyArrays: true
    })
    

    若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人

    2020-06-18
    有用 2
    回复 1
    • notfound
      notfound
      2020-06-18
      可以,加上这个属性确实可以了,不过因为我需要的字段比较多,所以还是用我下面这种方法感觉简洁一点,要不然一个一个的$.first()感觉有点蠢
      2020-06-18
      回复
  • notfound
    notfound
    2020-06-18

    我用这种办法实现了

    let result = await db.collection('xxx').doc(id).get()
    
    result.data.list.sort((a, b) => {
           return a.date < b.date ? 1 : -1
        })
    
    2020-06-18
    有用
    回复
登录 后发表内容
问题标签