Mongodb + C#:如何查询子文档并按其最常用的顺序

Posted

技术标签:

【中文标题】Mongodb + C#:如何查询子文档并按其最常用的顺序【英文标题】:Mongodb + C#: how to query sub-document and order by its used most 【发布时间】:2021-10-12 21:45:31 【问题描述】:

我有这样的集合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 次​​p>

最后是Tag2

请帮我这样查询。

提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

你可以试试代码here also

【讨论】:

谢谢@Takis。如我所愿,顺便学习新语法$unset。再次感谢。 你能为$unset写mongodb驱动C#吗? @塔基斯? 对不起,我不知道如何使用 C# 驱动程序查询生成器,但您可以使用 "$project" : "_id" : 0 来做同样的事情 是的,我设法使用了 $projection 并处理了一些东西,但我喜欢使用 $unset 的方式。还是谢谢。

以上是关于Mongodb + C#:如何查询子文档并按其最常用的顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用spring MongoTemplate查询子文档,并按子文档的某个字段排序?

如何使用 C# 驱动程序更新 MongoDB 数组中的子文档

如何在 MongoDB 中执行高级子文档查询?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

MongoDB $reduce(aggregation) 组与数组中嵌套文档的总和并按组计数