mongodb - Spring mongo:使用 IN 子句查询子文档数组以获取匹配的子文档
问题描述
嗨有一个集合如下:
客户偏好
{
clntId: 1234,
clntType: "internal",
status: "PROCESSED",
prefs: [
{
name: "AAA",
value: "value1"
},
{
name: "BBB",
value: "value2"
},
{
name: "CCC",
value: "value3"
}
]
}
如果我通过 找到prefs.name $in ("AAA", "CCC")
,我将获得所有子文档以及父文档。然后我尝试prefs.$: 1
在@Query 的字段参数中使用,但它只返回第一个匹配的子文档。
期望的输出
{
clntId: 1234,
clntType: "internal",
status: "PROCESSED",
prefs: [
{
name: "AAA",
value: "value1"
},
{
name: "CCC",
value: "value3"
}
]
}
有没有办法通过使用@Query
注释来获取 AAA 和 CCC 子文档。如果没有,那么如何使用聚合来做到这一点?对 mongo 来说仍然很新,所以无法找到获得所需结果的方法。
解决方案
你需要project
什么是需要的。
{
"prefs.$":1,
"clntType":1,
"status":1
}
询问:
db.collection.find({
"prefs.name": "AAA"
},
{
"prefs.$": 1,
"clntType": 1,
"status": 1
})
输出:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"clntType": "internal",
"prefs": [
{
"name": "AAA",
"value": "value1"
}
],
"status": "PROCESSED"
}
]
获取所有子文档:
db.collection.aggregate([
{
"$unwind": "$prefs"
},
{
"$match": {
"prefs.name": {
"$in": [
"AAA",
"CCC"
]
}
}
}
])
如果你想再次对所有数据进行分组,你可以玩
db.collection.aggregate([
{
"$unwind": "$prefs"
},
{
"$match": {
"prefs.name": {
"$in": [
"AAA",
"CCC"
]
}
}
},
{
"$group": {
"_id": "$_id",
"data": {
"$push": "$$ROOT"
}
}
}
])
推荐阅读
- excel - 为什么当我在 excel VBA 上运行这个宏时什么都没有发生?我错过了什么吗?
- html - 为什么我的第一行的高度大于其他行 HTML
- python - 如何在单个 Django 视图中跨多个模型进行查询?
- c++ - 我的程序无法正常工作,我的函数不断抛出分段错误
- python - Python从链接读取计时器值
- android - Google 重置密钥证书后,Firebase Google 登录不起作用
- r - spatstat 拟合混合模型中估计的置信区间
- laravel - 找不到 Laravel 类控制器,因为路由非常区分大小写
- azure - 如何在我的 Azure 应用服务实例上获取 .NetCore 3.0+?
- javascript - 使用 Axios Post 时未找到购物车会话