在MongoDB中如何选择满足某些条件的随机文档

toe95027  于 2023-01-08  发布在  Go
关注(0)|答案(1)|浏览(172)

基本上,我有文件,其中我有一个领域称为"难度水平"和这个领域的价值是1至10之间的每个文件。
因此,我必须随机选择10或20个文档,以便在随机选择的文档中,每个难度级别(即从1到10)应至少有一个文档。表示应至少有一个文档具有"难度级别":1、"难度等级":2、"难度等级":3 .........."难度等级":10.
那么,我怎么能随机选择满足这个条件的文档呢?
谢啦,谢啦
我尝试了$rand操作符来选择随机文档,但无法获得该条件的解决方案。

44u64gxh

44u64gxh1#

如果我没理解错的话,你可以试试这样的方法:
此处的目标是创建查询like this example
这个查询使用$sample得到两个随机元素,一个用于level1,另一个用于level2,使用$facet可以得到多个结果。

db.collection.aggregate([
  {
    "$facet": {
      "difficulty_level_1": [
        {
          "$match": { "difficulty_level": 1 } },
        { "$sample": { "size": 1 } }
      ],
      "difficulty_level_2": [
        { "$match": { "difficulty_level": 2 } },
        { "$sample": { "size": 1 } } 
      ]
    }
  }
])

所以关键是要以动态的方式进行这个查询,所以你可以使用JS来创建对象查询,并把它传递给mongo调用。

const random = Math.floor((Math.random()*10)+1) // Or wathever to get the random number

let query = {"$facet":{}}
for(let i = 1 ; i <= random; i++){
  const difficulty_level = `difficulty_level_${i}`
  query["$facet"][difficulty_level] = [
      { $match: { difficulty_level: i }},
      { $sample: { size: 1 }}
    ]
}
console.log(query) // This output can be used in mongoplayground and it works!
// To use the query you can use somethiing like this (or other way you call the DB) 
this.db.aggregate([query])

相关问题