问题描述
{
"courseName" : "AI","user" : ObjectId("6087dc4c2ba7a828363c9fca"),"questions" : [
{
"optionsSet" : [
{
"value" : "A",},{
"value" : "B",}
],"topics" : ["b","c","a"],"createdAt" : "2021-07-07T18:41:18.971Z"
},{
"optionsSet" : [
{
"value" : "C",{
"value" : "D","topics" : ["c"],"createdAt" : "2021-08-07T18:41:18.971Z
},{
"optionsSet" : [
{
"value" : "CC",{
"value" : "DD","topics" : ["b"],"createdAt" : "2021-08-07T18:41:30.971Z"
}
]
}
有时我必须只使用匹配 courseName
和 user
。
另一次我必须用 courseName
user
和 topics
查询
其中至少匹配一个主题的主题。我该如何处理这个过程?
当我将输入作为 courseName
、user
和主题 ["b"]
传递时。我在返回输出中取消选择 user
和 optionsSet
。我的预期输出将是:
{
"courseName" : "AI","questions" : [
{
"topics" : ["b",{
"topics" : ["b"],}
]
}
这可能吗?
解决方法
可以使用聚合查询,
-
$match
使用$in
运算符检查您的条件 -
$filter
迭代questions
的循环并检查主题是否有任何输入搜索topics
-
$filter
迭代topics
的循环并搜索topics
let p = YourSchema.aggregate();
// courseName
if (req.body.courseName) p.match({ courseName: req.body.courseName });
// user
if (req.body.user) p.match({ user: req.body.user });
// topics
if (req.body.topics) {
p.match({ "questions.topics": { $in: req.body.topics } });
p.addFields({
questions: {
$filter: {
input: "$questions",cond: {
$ne: [
{
$filter: {
input: "$$this.topics",cond: { $in: ["$$this",req.body.topics] }
}
},[]
]
}
}
}
});
}
let result = await p.exec();