我有一个mongoDB对象,类似于
{
"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", "c", "a"],
},
{
"topics" : ["b"],
}
]
}这个是可能的吗?
发布于 2021-06-29 13:04:36
您可以使用聚合查询,
$match使用$in运算符检查您的状态$filter来迭代questions的循环并检查是否有任何输入搜索topics$filter迭代topics循环并搜索topicslet 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();https://stackoverflow.com/questions/68178311
复制相似问题