我有一个引用另一个文档的文档,我想加入这些文档并根据子文档中数组的内容进行筛选:
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))
这工作得很好,但是我怎么能排除部署机器不活动的结果呢?我觉得它必须进入项目,但找不到有效的条件。感谢任何帮助。
您可以在管道中添加更多条件
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文档,没有发现任何内容。是否有我遗漏的东西或尚未实施?