0

我有这样的Sites收藏

 {
   _id: ObjectId("5ed4d2ed8a98dd17c467c040"),
   name:"Name1",
   description:"Desc1",
   tags:[
      "Tag1",
      "Tag3"
   ]
 },
 {
   _id: ObjectId("5ed4d2ed8a98dd17c467c040"),
   name:"Name2",
   description:"Desc2",
   tags:[
      "Tag1",
      "Tag3"
   ]
 },
 {
   _id: ObjectId("5ed4d2ed8a98dd17c467c040"),
   name:"Name3",
   description:"Desc3",
   tags:[
      "Tag1",
      "Tag4"
   ]
 },
 {
   _id: ObjectId("5ed4d2ed8a98dd17c467c040"),
   name:"Name4",
   description:"Desc4",
   tags:[
      "Tag3",
      "Tag4"
   ]
 },
 {
   _id: ObjectId("5ed4d2ed8a98dd17c467c040"),
   name:"Name5",
   description:"Desc6",
   tags:[
      "Tag1",
      "Tag2"
   ]
 }
]

我想按最常用的标签查询所有标签的顺序。

所以在这个例子中,查询应该是返回

"Tag1", "Tag3", "Tag4", "Tag2"

因为

Tag1出现最多 4 次

Tag3出现 3 次

Tag4出现 2 次

最后Tag2

请帮助我进行这样的查询。

提前致谢。

4

1 回答 1

1

如果你只想要按计数排序的标签,你可以试试这个。

db.collection.aggregate([
  {
    "$unwind": "$tags"
  },
  {
    "$group": {
      "_id": "$tags",
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$sort": {
      "count": -1
    }
  },
  {
    "$group": {
      "_id": null,
      "tags": {
        "$push": "$_id"
      }
    }
  },
  {
    "$unset": "_id"
  }
])

这使它成为一个排序标签的数组。重要的部分是直到$sort.

您也可以在此处尝试代码

于 2021-08-09T10:06:42.300 回答