mongodb - Mongo 聚合和过滤器
问题描述
我正在尝试使用以下查询过滤文档:
db.projects.aggregate([
{
$project: {
deployments: {
$filter: {
input: "$releases.deployments",
as: "deployment",
cond: { $eq: ["$$deployment.environment", "Live"] }
}
}
}
}
])
的输出deployments
始终是一个空数组,尽管如果我将条件更改为$ne
then 它会返回所有结果。
如何获得过滤条件以仅返回deployment.environment
等于字符串的记录Live
?
这是一段 json 示例:
{
"project_id": "1",
"project_group": "A",
"releases": [
{
"version": "1",
"deployments": [
{
"environment": "Integration",
"created": "2019-10-01T06:40:01.000Z",
"state": "Success",
"name": "Deploy to Integration"
},
{
"environment": "Test",
"created": "2019-10-01T08:23:58.000Z",
"state": "Success",
"name": "Deploy to Test"
},
{
"environment": "Live",
"created": "2019-10-01T09:02:17.000Z",
"state": "Success",
"name": "Deploy to Live"
}
]
}
]
}
解决方案
releases
如果您的查询是嵌入式文档,但它是一组嵌入式文档,您的查询将完美运行。
以下查询将遍历每个元素releases
并过滤环境为 的部署Live
。
db.collection.aggregate([
{
$project:{
"releases":{
$map:{
"input":"$releases",
"as":"release",
"in":{
$mergeObjects:[
"$$release",
{
"deployments":{
$filter:{
"input":"$$release.deployments",
"as":"deployment",
"cond":{
$eq:["$$deployment.environment","Live"]
}
}
}
}
]
}
}
}
}
},
{
$project:{
"releases":{
$filter:{
"input":"$releases",
"as":"release",
"cond":{
$ne:["$$release.deployments.0",null]
}
}
}
}
}
]).pretty()
输出:
{
"_id" : ObjectId("5d93401ef2e6411a68a145ee"),
"releases" : [
{
"version" : "1",
"deployments" : [
{
"environment" : "Live",
"created" : "2019-10-01T09:02:17.000Z",
"state" : "Success",
"name" : "Deploy to Live"
}
]
}
]
}
推荐阅读
- react-native - react-native-webview:混合内容模式不起作用
- matlab - 在 arrayDatastore 上调用 readall 会永远冻结甚至很小的数组
- python - 熊猫:在同一个数据框中组合两行
- r - 使用现有 RData 文件列创建新的 RData 文件
- python-3.x - 在 tkinter 文本小部件中绑定 '<' 和 '>' 字符
- php - 使用 chrome 查看通过 mpdf 生成的 pdf 时,有没有办法设置初始缩放?
- sql - Oracle 多次替换
- python - 提取 IMDb 电影图像
- java - 如何在 Java 中验证字符串格式?
- java - 我不知道在哪里放置我的第二个 Scanner 关闭,有谁知道我是否需要添加第二个或者我是否需要 if 语句在 while 循环所在的位置?