mongodb - mongo $filter 和子子数组中的多个条件
问题描述
我有这部分收藏:
[{
"_id": ObjectId("604f3ae3194f2135b0ade569"),
"parameters": [
{
"_id": ObjectId("602b7455f4b4bf5b41662ec1"),
"name": "Purpose",
"options": [
{
"id": ObjectId("602b764ff4b4bf5b41662ec2"),
"name": "debug",
"sel": true
},
{
"id": ObjectId("602b767df4b4bf5b41662ec3"),
"name": "performance",
"sel": false
},
{
"id": ObjectId("602b764ff4b4bf5b41662ec4"),
"name": "security",
"sel": true
},
{
"id": ObjectId("602b767df4b4bf5b41662ec5"),
"name": "Not Applicable",
"sel": false
}
],
"type": "multiple"
}]
}]
这个查询:
db.testCollection.aggregate([
{ $unwind: "$parameters" },
{
$match: {
"parameters._id": ObjectId("602b7455f4b4bf5b41662ec1"),
}
},
{
$addFields: {
match: {
$filter: {
input: "$parameters.options",
as: "option",
cond: {
$and: [
{ $eq: ["$$option.id", ObjectId('602b764ff4b4bf5b41662ec2')] },
{ $eq: ["$$option.sel", true] }
]
}
}
}
}
}
])
结果是一个新的数组匹配,在这种情况下,
"match": [
{
"id": ObjectId("602b764ff4b4bf5b41662ec2"),
"name": "debug",
"sel": true
}
]
我如何匹配,对于集合,例如匹配
"id": ObjectId("602b764ff4b4bf5b41662ec2") and
"id": ObjectId("602b764ff4b4bf5b41662ec4")
并有一个结果数组或两个结果或为空?
解决方案
我不确定在单一条件下是否可能$filter
,但你可以尝试$let
,
$let
声明一个名为的变量filtered
并存储您的过滤结果$in
检查条件,如果过滤后的元素大小为 2,则返回过滤后的结果,否则返回空白数组- 您必须将与过滤器中的 id 数匹配的数字置于
$eq
条件中
{
$addFields: {
match: {
$let: {
vars: {
filtered: {
$filter: {
input: "$parameters.options",
as: "option",
cond: {
$and: [
{
$in: [
"$$option.id",
[ObjectId("602b764ff4b4bf5b41662ec2"), ObjectId("602b767df4b4bf5b41662ec3")]
]
},
{ $eq: ["$$option.sel", true] }
]
}
}
}
},
in: {
$cond: [
{ $eq: [{ $size: "$$filtered" }, 2] },
"$$filtered",
[]
]
}
}
}
}
}
推荐阅读
- javascript - Graphql 调用后处理错误和显示消息的正确方法
- optimization - CPLEX 中的有限解抛光
- r - 异常值检测的邻域计算
- reactjs - 一定长度后动态突出显示字符?
- apache-spark - 如何在 kubernetes 中连接 2 个 pod,因为它们位于同一个本地网络中并打开所有端口
- python - 使用 Python 从文件目录导入多个选定的 json 文件
- ajax - 需要通过 Azure AD 进行身份验证的应用程序中的动态更新页面
- sql-server - 使用 Azure AD 的 ASP.NET Core Web 应用程序,在本地记录登录
- javascript - 我的机器人不断向同一条消息发送垃圾邮件。怎么了?
- php - 将长 html 拆分成更小的部分