mongodb聚合和过滤数据
Posted
技术标签:
【中文标题】mongodb聚合和过滤数据【英文标题】:mongodb agregate and filter data 【发布时间】:2021-07-26 23:04:08 【问题描述】:我尝试在 javascript 中使用 mongoose 过滤来自 mongodb 的一些结果数据。
这是我的 json 结构:
"name": "john",
"firstname": "doe",
"yearold": 22,
"recipes": [
"title": "cheesecake",
"data": [
"name": "egg",
"label": "Eggs for",
"value": 6,
"unit": "piece"
,
"name": "oil",
"label": "Specific oil",
"unit": "oz",
"value": 0.2
,
"name": "flour",
"label": "Wholemel flour",
"value": 450,
"unit": "gr"
]
,
"title": "cake",
"data": [
"name": "egg",
"label": "Eggs for",
"value": 6,
"unit": "piece"
,
"name": "flour",
"label": "Wholemel flour",
"value": 500,
"unit": "gr"
,
]
]
在某些情况下,我需要返回隐藏一些值的 json 数据。例如我有一个列表,指定所有要隐藏的值
hidekeys=["egg"];
我想得到这个:
"name": "john",
"firstname": "doe",
"yearold": 22,
"recipes": [
"title": "cheesecake",
"data": [
"name": "egg",
"label": "Eggs for",
"value": #######,
"unit": "piece"
,
"name": "oil",
"label": "Specific oil",
"unit": "oz",
"value": 0.2
,
"name": "flour",
"label": "Wholemel flour",
"value": 450,
"unit": "gr"
]
,
"title": "cake",
"data": [
"name": "egg",
"label": "Eggs for",
"value": #######,
"unit": "piece"
,
"name": "flour",
"label": "Wholemel flour",
"value": 500,
"unit": "gr"
,
]
]
对于每个配方,如果在 hidekeys 中指定,我需要隐藏成分值。
我用 $project 和 $cond 尝试了一些东西,但它不起作用
【问题讨论】:
你用的是哪个版本的mongodb? 我使用 mongodb 4.4.3 【参考方案1】:下面是使用$map实现此目的的快速方法
const hidekeys = ["egg"];
db.collection.aggregate([
$addFields:
recipes:
$map:
input: "$recipes",
as: "recipe",
in:
$mergeObjects: [
"$$recipe",
data:
$map:
input: "$$recipe.data",
as: "datum",
in:
"$mergeObjects": [
"$$datum",
$cond: [
"$setIsSubset": [
[
"$$datum.name"
],
hidekeys
]
,
value: "#####"
,
value: "$$datum.value"
]
]
]
])
Mongo Playground
【讨论】:
谢谢它的工作!当我们检查 datanum.name 是否是 hidekeys 的子集时,是否可以忽略大写锁定?【参考方案2】:有一种方法可以忽略 hidekeys 和 datum.name 之间的大小写吗?
【讨论】:
以上是关于mongodb聚合和过滤数据的主要内容,如果未能解决你的问题,请参考以下文章
MongoDb 聚合基于 ids 过滤列表并将此过滤列表映射到另一个字段
如何通过将数据作为参数传递以过滤 unix 时间戳来查询具有聚合的 mongodb
mongodb Aggregation聚合操作之$facet