mongodb - 从 mongodb 的文档中获取匹配的数组元素
问题描述
假设我在 mongodb 中有这些文件:
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"myList" : [
{
"a" : true,
"b" : mydata1
},
{
"a" : true
"b" : mydata2
},
{
"a" : false
"b" : mydata3
},
{
"a" : false
"b" : mydata4
},
{
"a" : true
"b" : mydata5
}
]
}
我想获取所有包含“ a:true ”的数组单元格。
我尝试了 mongodb find(),但它只返回单个第一个匹配,这是一个问题。
我最终使用了 $filter因为我不想使用$unwind(性能问题)。
试图执行这一行,不起作用:
.aggregate([
{$match: {_id: NUUID("d75dcc8d-ecb2-4d23-99d5-347bc99cfeec")}},
{$project:
{
myList:
{
$filter: {
input: '$myList',
as: 'myElement',
cond: {$eq: [{'$$myElement.a': true}]}
}}
}
}
])
但这似乎不起作用,它说 $$ 未被识别。我徘徊我错过了什么,为什么不能使用 find() ?使用项目请求数组中的某些元素听起来很基本。
解决方案
对我来说正在工作(分片集群版本 4.4.3):
mongos> db.e.find()
{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : false, "b" : "mydata3" }, { "a" : false, "b" : "mydata4" }, { "a" : true, "b" : "mydata5" } ] }
{ "_id" : ObjectId("512e28984815cbfcb21646a8"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : false, "b" : "mydata3" }, { "a" : false, "b" : "mydata4" }, { "a" : true, "b" : "mydata5" }, { "a" : true, "b" : "mydata6" } ] }
mongos> db.e.aggregate({$project: { myList: { $filter:{ input:"$myList" , as:"element" , cond: {$eq:[ "$$element.a",true ] } } } }})
{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : true, "b" : "mydata5" } ] }
{ "_id" : ObjectId("512e28984815cbfcb21646a8"), "myList" : [ { "a" : true, "b" : "mydata1" }, { "a" : true, "b" : "mydata2" }, { "a" : true, "b" : "mydata5" }, { "a" : true, "b" : "mydata6" } ] }
mongos>
推荐阅读
- python - Python - Selenium webdriver可以附加到浏览器中现有的运行会话
- python - 当我尝试访问我的 Django 站点时出现内部服务器错误
- c - C中的多线程与多处理
- c# - 在布局文件中读取整数会话值
- python-3.x - 如何在 simulink 中运行经过训练的 keras 模型?
- python - 为什么这段代码会产生这样的输出而不是这样的输出?
- sql - 在 sql 语句上收到 Null
- javascript - 当父级“选择”类时如何更改图像 src?
- javascript - 标识符后跟冒号
- c++ - 在 C++ 中,是否有任何理由生成并立即加入线程,而不是直接调用函数?