mongodb - 如何在 MongoDB 中使相同的集合内部连接等效?
问题描述
我有看起来像 EAV(或某些键/值)的集合:
{domain_id: 1, key: "A", value: 1}
{domain_id: 1, key: "B", value: 2}
{domain_id: 1, key: "C", value: 3}
{domain_id: 2, key: "A", value: 5}
{domain_id: 2, key: "B", value: 2}
{domain_id: 2, key: "C", value: 3}
{domain_id: 3, key: "C", value: 3}
我需要找到所有domain_id
拥有key = "A" AND value = 1
和拥有的东西key = "C" AND value = 3
(交叉点,而不是 OR 条件)所以假设的结果将是:
{domain_id: 1}
解决方案
$group
- 分组依据domain_id
并$push
在data
字段中记录。$match
-$and
用于多重比较,$elemMatch
以匹配数组元素中的字段值。$project
- 选择domain_id
。
db.collection.aggregate([
{
$group: {
_id: "$domain_id",
data: {
$push: "$$ROOT"
}
}
},
{
$match: {
$and: [
{
"data": {
$elemMatch: {
"key": "A",
"value": 1
}
}
},
{
"data": {
$elemMatch: {
"key": "C",
"value": 3
}
}
}
]
}
},
{
$project: {
domain_id: "$_id"
}
}
])
推荐阅读
- html - 如何在 sublime text 3 中关闭浏览器同步?
- bash - 限制 sed 删除所有结尾相同的 url
- visual-studio-code - 如何在 VS 代码中启用时间线视图?
- python - 在“for”循环中初始化 Python 索引
- node.js - 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头。无法重定向与应有的页面不同的页面
- php - Laravel 7.14 批量更新表单按钮不起作用
- html - Firebase - 验证用户,然后写入数据库?
- python - 字节的可读十六进制转储
- php - 使用 100 天 php 针对特定数量的随机浮动
- android - 如何使用 SavedStateHandle 和导航安全参数