Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中
Posted
技术标签:
【中文标题】Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中【英文标题】:Mongoose- Search/Filter data from array into another array with the specific items 【发布时间】:2021-09-11 15:23:14 【问题描述】:我有一个类似的 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"],
]
这可能吗?
【问题讨论】:
你可以使用点符号 "questions.topics": "a"
我的输入将是数组。像 ["a", "b"]
可以使用$in操作符 "questions.topics": "$in": ["a", "b"]
我更新了我的问题,turivishal
【参考方案1】:
可以使用聚合查询,
$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();
Playground
【讨论】:
我可以不使用聚合框架进行查询吗?我还必须匹配其他字段。我更新了我的问题。请不要介意 turrivishal。 我已经用猫鼬聚合管道生成器更新了答案。 你使用YourSchema
是数据库模型还是只是模式?我得到一个空数组作为输出。
它的猫鼬数据库模式模型。
你能再帮忙吗?我使用了我想在正常聚合中检索/选择的元素。但是这样我不想选择用户作为返回对象。我该怎么做?以上是关于Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose:如果值存在于对象数组中的数组中,则过滤数据
过滤和更新 mongodb mongoose 中的嵌入式数组