如何通过字符串数组对mongodb中的文档进行排序

rsaldnfx  于 2023-01-25  发布在  Go
关注(0)|答案(1)|浏览(130)

例如,我有一个名为Dialogs的文档集合。格式:

Dialogs{
  {
    _id: ObjectId(),
    members: [
      "admin",
      "all"
    ]
  },
  {
    _id: ObjectId(),
    members: [
      "user_637b2ed34ce3130e8532c4b9",
      "admin"
    ]
  },
  {
    _id: ObjectId(),
    members: [
      "group_637c708927f9df62ca646623",
      "admin"
    ]
  },
  {
    _id: ObjectId(),
    members: [
      "admin",
      "group_63a70e959fm566d28skkfi5b2",
      "user_427b2ed34ce4h50e8532c92h"
    ]
  },
}

我需要按以下顺序返回已排序的文档:首先是仅包含all的文档,然后是包含all和某个组的文档,然后是仅包含组的文档,然后是包含组和用户的文档,最后是仅包含用户的文档(每个数组都有一个admin字符串)。
我尝试使用聚合,但没有任何React

e4yzc0pl

e4yzc0pl1#

一个选项是使用$switch添加字段:

db.collection.aggregate([
  {$addFields: {memberTypes: {$map: {
          input: "$members",
          in: {$first: {$split: ["$$this", "_"]}}
  }}}},
  {$addFields: {
      order: {$switch: {
          branches: [
            {
              case: {$eq: [{$size: {$setUnion: ["$members", ["admin", "all"]]}}, 2]},
              then: 1
            },
            {
              case: {$in: ["all", "$members"]},
              then: 2
            },
            {
              case: {$and: [
                      {$in: ["group", "$memberTypes"]},
                      {$not: {$in: ["user", "$memberTypes"]}}
              ]},
              then: 3
            },
            {
              case: {$in: ["group", "$memberTypes"]}]},
              then: 4
            }
          ],
          default: 5
        }
      }
    }
  },
  {$sort: {order: 1}},
  {$unset: ["memberTypes", "order"]}
])

了解它在playground example上的工作原理

相关问题