在MongoDB中获取数组中的随机元素

这是我的数据库结构

{ "_id" : ObjectId("576155226d1d298c2cc3edca"), "questionLibrary" : { "technologyName" : "CSS", "questions" : [ { "correctanswer" : { "A1" : "CSS1" }, "answeroption" : { "A4" : "CSS1", "A3" : "CSS1", "A2" : "CSS1", "A1" : "CSS1" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS1" }, { "question" : "CSS2", "tags" : "CSS", "answeroption" : { "A1" : "CSS2", "A2" : "CSS2", "A3" : "CSS2", "A4" : "CSS2" }, "level" : "Amature", "correctanswer" : { "A1" : "CSS2" } }, { "correctanswer" : { "A1" : "CSS3" }, "answeroption" : { "A4" : "CSS3", "A3" : "CSS3", "A2" : "CSS3", "A1" : "CSS3" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS3" }, { "correctanswer" : { "A1" : "CSS4" }, "answeroption" : { "A4" : "CSS4", "A3" : "CSS4", "A2" : "CSS4", "A1" : "CSS4" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS4" }, { "correctanswer" : { "A1" : "CSS5" }, "answeroption" : { "A4" : "CSS5", "A3" : "CSS5", "A2" : "CSS5", "A1" : "CSS5" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS5" }, { "correctanswer" : { "A1" : "CSS6" }, "answeroption" : { "A4" : "CSS6", "A3" : "CSS6", "A2" : "CSS6", "A1" : "CSS6" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS6" }, { "correctanswer" : { "A1" : "CSS7" }, "answeroption" : { "A4" : "CSS7", "A3" : "CSS7", "A2" : "CSS7", "A1" : "CSS7" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS7" }, { "correctanswer" : { "A1" : "CSS8" }, "answeroption" : { "A4" : "CSS8", "A3" : "CSS8", "A2" : "CSS8", "A1" : "CSS8" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS8" }, { "correctanswer" : { "A1" : "CSS9" }, "answeroption" : { "A4" : "CSS9", "A3" : "CSS9", "A2" : "CSS9", "A1" : "CSS9" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS9" }, { "correctanswer" : { "A1" : "CSS10" }, "answeroption" : { "A4" : "CSS10", "A3" : "CSS10", "A2" : "CSS10", "A1" : "CSS10" }, "level" : "Amature", "tags" : "CSS", "question" : "CSS10" } ] }, "__v" : 3 } 

从问题数组中,我想每次启动查询时都会得到一个随机对象(随机问题)。

我不想一次收集所有的对象,并在节点上进行处理。 是否有可能编写一个查询,以便每次都会返回一个随机对象?

试试这个逻辑

1)在数组“questions”上使用$ unwind ,如果使用includeArrayIndex,它将创build带索引的文档在unwind文档中查看示例

2)展开后,数组传递一个随机数来检索一个问题

您需要使用$unwind运算符来$unwind对“questions”数组的规范化。 从那里你可以使用$sample pipeline操作符返回一个随机文档(随机问题)。

 db.collection.aggregate( [ { "$unwind": "$questionLibrary.questions" }, { "$sample": { "size": 1 } } ] ) 

但是我build议你改变你的文档结构并将“问题”保存到它自己的集合中,因为$unwind可以产生一个非常大的结果。