Mongodb 聚合将参数传递给 $sample 的元素大小

2024-03-26

大家好,这里的任何人都可以帮助我解决以下问题

  • 我想获得随机数量的测验列表
  • 随机数将 以每节课为基础

问题是

  • mongodb 不允许将参数传递给 $sample 的元素大小

任何人都可以给我解决方案

lessonModel.aggregate([
        { $match : {'quiz.status':1 } },
        {
            $lookup : {
                from : 'quiz',
                let : { 'lesson_id' : '$_id','limit' : '$quiz.amount' },
                pipeline : [
                    { 
                        $match: { 
                            $expr: { 
                                $eq: [ "$lesson_id", "$$lesson_id" ]
                            } 
                        } 
                    },
                    { 
                        $project: {
                            title:1,
                            check_list:1,
                            duration:1
                        }               
                    },
                    { $sample: { size: '$$limit' } }
                ],
                as: 'quiz'
            }
        }, 
        {$unwind: '$quiz'},
        { $replaceRoot: { newRoot: "$quiz" } }
    ]).exec();

错误表示 $sample 的 size 参数必须是数字

Here is my sample data Sample data


UPDATE

我认为你的主要问题是随机选择amount数量quiz每节课下都有。自从$sample没有帮助使用$function https://docs.mongodb.com/manual/reference/operator/aggregation/function/(MongoDB 4.4 版本中的新增功能)。

Solution

Inside $function运算符写入一些逻辑

  1. 随机排列问题 https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array/6274381#6274381(您可以根据您的要求进行更改)。
  2. 对其进行切片以返回数字(amount)所需的问题。
db.lessons.aggregate([
    { $match: { "quiz.status": 1 } },
    {
        $lookup: {
            from: "quiz",
            let: { "lesson_id": "$_id" },
            pipeline: [
                {
                    $match: {
                        $expr: { $eq: ["$lesson_id", "$$lesson_id"] }
                    }
                },
                {
                    $project: {
                        title: 1,
                        check_list: 1,
                        duration: 1
                    }
                }
            ],
            as: "questions"
        }
    },
    {
        $project: {
            quiz: {
                $function: {
                    body: function(questions, amount) {
                        if (amount == 0) return [];

                        for (let i = questions.length - 1; i > 0; i--) {
                            const j = Math.floor(Math.random() * (i + 1));
                            [questions[i], questions[j]] = [questions[j], questions[i]];
                        }

                        return questions.slice(0, amount);
                    },
                    args: ["$questions", { $ifNull: ["$quiz.amount", 0] }],
                    lang: "js"
                }
            }
        }
    },
    { $unwind: "$quiz" },
    { $replaceRoot: { newRoot: "$quiz" } }
]);

$sample不支持变量。必须明确指定一个数字,例如:

{ 
    $sample: { size: 1 }
}

还要更换你的let如下图,因为最后lesson文档没有amount提交于quiz object

let: {
    'lesson_id': '$_id',
    'limit': { $ifNull: ['$quiz.amount', 0] } // or any other number.
},

Wrong:

{ 
    $sample: { size: "$$limit" } // Wont work!
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongodb 聚合将参数传递给 $sample 的元素大小 的相关文章

随机推荐

  • 如何使用 systemctl systemd 启动 svnserve

    debian jessie 中的 subversion 软件包不包含 systemd 服务文件 自动启动的最简单解决方案是什么 我尝试 Unit Description Subversion protocol daemon After sy
  • C++ 中将值作为常量、引用和常量引用返回有何含义?

    我正在学习C 但我仍然对此感到困惑 在 C 中将值作为常量 引用和常量引用返回有何含义 例如 const int exampleOne int exampleTwo const int exampleThree 以下是您所有案件的内幕 通过
  • 使用委托将数据从一个 TableView 传输到另一个 TableView

    我需要从一个传输一个字符串tableview通过单击一个内的按钮到另一个UITableView 我知道如何获得indexPath通过按钮 如下所示 let button sender as MyButton let view button
  • Powerpoint 2010 多个实例

    我在这里看到了很多关于这个主题的帖子 但似乎没有一个直接回答这个问题 我想控制在第二台显示器上运行的两个 Powerpoint 实例 理想的解决方案如下所示 PowerPoint Application PPTViewer1 new Pow
  • Spring MVC 处理会话过期

    我正在与Jboss EAP 6 2 Java EE 6 and Spring MVC 4 0 2 当会话过期时 我想执行页面重定向 我开发了一个 Spring 拦截器 Component public class SessionExpire
  • 分割seeds.rb文件[重复]

    这个问题在这里已经有答案了 My seeds rb文件变得非常大 重构文件中数据的最佳方法是什么 我可以将数据放入各种文件中吗 require他们在seeds rb file 我们将所有种子存储在文件夹中db seeds并在里面db see
  • 等待异步调用在完成块内完成

    我目前正在开发一个 POC 应用程序 我之前曾在这里发布过相关内容 https stackoverflow com questions 47418653 nsurlsessiondatatask authentication challen
  • 基于 Licenses.licx 的 .Net 组件许可模型如何工作?

    我遇到过多个使用许可方案的第三方 Net 组件供应商 在评估副本上 组件会显示导航屏幕或水印或某些此类指示器 在获得许可的机器上 许可证 licx被创建 看起来是什么just程序集全名 标识符 构建客户端程序集时必须包含此文件 这个模型如何
  • 从 NOT EXISTS 转换为 NOT IN

    我有三张桌子 sailor 姓名 评级 boat 名称 颜色 等级 reservation sname bname 工作日 开始 结束 为了获得预订每艘红船的水手名单 我有 select s sname from sailor s wher
  • 从字符串中提取除方括号中的单词之外的所有单词

    我再次完全陷入创建正则表达式的困境 我有一个字符串模式 例如 str wordA wordAB xyz wordABC x 所以总有一个词后面跟有括号里的东西 或空括号 单词的长度 前导和尾随空格以及括号内的字符数是随机的 该序列重复的频率
  • 使用 SQLAlchemy 时 pandas.read_sql() 比 pyodbc 慢得多

    我正在尝试从 SQL 读取一个小表 并且正在考虑从 pyodbc 切换到 SQLAlchemy 以便能够使用 pd to sql 当我比较两者时 sql alchemy 慢得多 s py import pandas as pd import
  • 为什么 amp-video 和 amp-audio 强制对 src 使用 https?

    关于文档AMP 视频 https www ampproject org docs reference amp video html这表明 src 如果没有孩子在场 则需要 必须是 HTTPS 为什么需要这个 这是出于安全问题吗 我的视频和音
  • 将年份添加到 Java 日历不起作用

    请赐教我这一点 我只是想在当前日期上加上 10 年 然后从中减去到期日期以返回年数 public int getMaxYears int max 0 Calendar ten year later Calendar getInstance
  • Django 的 Redshift DB 后端

    我需要处理存储在 Amazon Redshift 服务器中的一些数据 由于我最熟悉 Django 因此我正在考虑在应用程序层使用它 但我不知道如何连接到 Redshift 并检索数据 我只有连接到本地 MySQL 服务器并工作的经验 所以这
  • “mov eax, [num]”和“mov eax, num”之间的区别

    我是一名初学者 正在编写汇编程序 使用以下代码打印从 1 到 9 的数字 section text global start start mov ecx 10 mov eax 1 l1 mov num eax mov eax 4 mov e
  • sudo a2enmod php5.6,php -v 仍然显示 php 7.01 冲突

    我正在尝试切换 php 版本 得到以下响应 我尝试卸载 mpm prefork 和 mpm worker 仍然没有乐趣 请提供任何想法 在 Ubuntu 16 04 上 sudo a2enmod php5 6 Considering dep
  • 复制并重命名文件 VBScript

    我需要将一个基于日期的名称的文件移动到另一个文件夹 文件结构为 Source network location folder Filename 09 11 2012 txt 目的地 C Dump Filename txt 源文件总是落后 1
  • Hibernate:加载与获取

    我知道这是一个常见问题 已经被描述过很多次了 但我仍然无法得到一些东西 性能怎么样 哪种方法更快 实际上 我需要一个简单的事情 页面发出一个 POST 请求 id 0 name John 服务器端脚本应检查 id 0 是否 然后在数据库中创
  • FieldConverter ConverterKind.Date“dd/MM/yyyy”异常

    我尝试读取 csv 文件 我的第五条记录包含日期 03 11 2008 这是我的一段代码 FieldConverter ConverterKind Date dd MM yyyy public DateTime datum 5 我的代码在此
  • Mongodb 聚合将参数传递给 $sample 的元素大小

    大家好 这里的任何人都可以帮助我解决以下问题 我想获得随机数量的测验列表 随机数将 以每节课为基础 问题是 mongodb 不允许将参数传递给 sample 的元素大小 任何人都可以给我解决方案 lessonModel aggregate