Mongodb + C#: как запросить вложенный документ и упорядочить его по наиболее часто используемому

avatar
jack.pop
9 августа 2021 в 06:59
83
1
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

Пожалуйста, помогите мне составить такой запрос.

Заранее спасибо.

Источник

Ответы (1)

avatar
Takis
9 августа 2021 в 10:06
1

Если вам нужны только теги, отсортированные по количеству, вы можете попробовать это.

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

Это делает его массивом отсортированных тегов. Важная часть до $sort.

Вы можете попробовать код здесь также

jack.pop
9 августа 2021 в 13:05
0

Спасибо @Такис. Работает так, как я ожидал, кстати, изучите новый синтаксис $unset. Спасибо еще раз.

jack.pop
9 августа 2021 в 13:12
0

Можете ли вы написать драйвер mongodb C # для $ unset? @Такис?

Takis
9 августа 2021 в 13:14
1

извините, я не знаю, как использовать построитель запросов драйвера C #, но вы можете сделать то же самое с {"$project" : {"_id" : 0}}

jack.pop
9 августа 2021 в 13:17
0

да, мне удалось использовать $projection и кое-что обработать, но мне нравится, как использовать $unset. Спасибо, в любом случае.