当前位置: 首页 > 知识库问答 >
问题:

查找管道中的MongoDB elemMatch?

上官凯泽
2023-03-14

我有一个引用另一个文档的文档,我想加入这些文档并根据子文档中数组的内容进行筛选:

deployment\u计算机文档:

{
  "_id": 1,
  "name": "Test Machine",
  "machine_status": 10, 
  "active": true
}

machine\u状态文档:

{
  "_id": 10,
  "breakdown": [
    {
      "status_name": "Rollout",
      "state": "complete"
    },
    {
      "status_name": "Deploying",
      "state": "complete"
    }
  ]
}

我使用的是Mongo 3.6,在查找和管道方面取得了一些成功,下面是我在python MongoEngine中使用的对象,它被传递给聚合函数:

pipeline = [
    {'$match': {'breakdown': {'$elemMatch': {'status_name': 'Rollout'}}}},
    {'$lookup':
        {
            'from': 'deployment_machine',
            'let': {'status_id': '$_id'},
            'pipeline': [
                {'$match':
                    {'$expr':
                        {'$and': [
                            {'$eq': ['$machine_status', '$$status_id']},
                        ]},
                    }
                }
            ],
            'as': 'result',

        },
    },
    {'$project': {
        'breakdown': {'$filter': {
            'input': '$breakdown',
            'as': 'breakdown',
            'cond': {'$eq': ['$$breakdown.status_name', 'Rollout']}            
        }}
    }},
]

result = list(MachineStatus.objects.aggregate(*pipeline))

这工作得很好,但是我怎么能排除部署机器不活动的结果呢?我觉得它必须进入项目,但找不到有效的条件。感谢任何帮助。

共有1个答案

屠振濂
2023-03-14

您可以在管道中添加更多条件

pipeline = [
  { $match: { breakdown: { $elemMatch: { status_name: "Rollout" } } } },
  {
    $lookup: {
      from: "deployment_machine",
      let: { status_id: "$_id" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$machine_status", "$$status_id"] },
            active: false
          }
        }
      ],
      as: "result",
    }
  },
  {
    $project: {
      breakdown: {
        $filter: {
          input: "$breakdown",
          as: "breakdown",
          cond: { $eq: ["$$breakdown.status_name", "Rollout"] },
        }
      }
    }
  }
];
 类似资料:
  • 我正在尝试用空格替换引号中的管道分隔字符。问题是我有很多误报,因为有些字符串为空。我只想在引号之间有文本时替换管道。我使用的正则表达式模式来自另一个stackoverflow帖子,因为我缺乏正则表达式技能。 数据样本: 我使用的代码: 它很好地取代了“蓝绿色”管道。但它也替换了引号之间的管道,这会在列被删除时破坏文件。 用我正在处理的文件的实际样本更新了代码。正则表达式找到了它,但没有替换管道。遗

  • 我有一个查询,它利用了$lookup的管道功能,还使用了$expr。嗯,这很有效,但性能不太好。它在一个包含约4000个文档的集合中查找内容,并连接其他两个集合(使用$查找块)。运行大约需要2000ms,即使每个集合中只有几千个文档。 查询如下所示: 在此上运行explain()仅提供有关第一个$匹配块的信息。但如何确定管道中的$expr是否使用索引? 我尝试向管道中使用的所有字段添加索引,还尝试

  • 我的两个系列是: 产品类别 产品 在$lookup中使用localfield和foreignfield,我可以获得预期的结果。 上面的工作正常,但我必须将$look kup中的管道模型用于另一个用例(用于添加$Geo近)。聚合查询如下所示。 这没有按预期工作,并返回大量条目。$match中的$exists没有得到正确执行。任何帮助,不胜感激。提前谢谢。

  • 我刚开始和内蒂一起工作。我已经有了一个服务器,我正在为一个客户端写代码。 在客户端,我用下面的代码为ClientBootstrap对象设置了一个新的PipelineFactory 其中ResponseHandler()是我扩展SimpleChannelHandler的类。 我想找到频道ID。我做到了。 但它会抛出IllelgalStateException并表示我无法调用getPipeline()

  • Mongo服务器的最新版本(3.6)在聚合的$查找阶段引入了一个很好的功能。现在,操作符将管道作为参数,在要加入的集合上运行(如这里所解释的),例如,这将允许在加入之前过滤将要加入的文档。有没有办法在java驱动程序中使用它?我查看了驱动程序参考和API文档,没有发现任何内容。是否有我遗漏的东西或尚未实施?