Sha*_*Ali 3 mongodb mongodb-query aggregation-framework
我有一个像
{
"_id": ObjectId('56a77bfae0ce9f6a738cb2b7'),
"nameIdentity": [
{
"givenNameOne": "LATANYA",
"givenNameThree": "BIZOR",
"lastName": "BIZOR",
"sourceReferenceId": [
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "A"
},
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "B"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
nameIdentity 是一个数组,而 sourceReferenceId 是 nameIdentity 中的一个嵌套数组。我正在尝试获取 sourceReferenceId 大小大于 2 的文档。我使用了这样的聚合:
db.entity.aggregate(
[
{
$project: {
nameIdentity_count: {$size: "$nameIdentity.sourceReferenceId"}
}
},
{
"$match": {
"nameIdentity_count": { "$gte": 2 }
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
这没有按预期工作,即使只有一个 soureReferenceId,它也会提供文档。谁能告诉我我哪里出错了?
sty*_*ane 13
您需要使用点符号和$exists运算符。如果您想要的只是find()“sourceReferenceId”大小大于的那些文档,那么您也不需要为此进行聚合2
db.collection.find( { "nameIdentity.sourceReferenceId.2": { "$exists": true } } )
Run Code Online (Sandbox Code Playgroud)
但是如果你真的需要聚合你的数据,那么:
db.collection.aggregate([
{ "$match": { "nameIdentity.sourceReferenceId.2": { "$exists": true } } }
])
Run Code Online (Sandbox Code Playgroud)
你也有一个设计问题,因为有一个值总是一个元素数组的字段没有任何意义。您应该考虑更改您的文档结构,使其看起来像这样:
{
"_id": ObjectId('56a77bfae0ce9f6a738cb2b7'),
"givenNameOne": "LATANYA",
"givenNameThree": "BIZOR",
"lastName": "BIZOR",
"sourceReferenceId": [
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "A"
},
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "B"
}
]
}
Run Code Online (Sandbox Code Playgroud)
并根据您要执行的操作使用以下查询。
db.collection.find( { "sourceReferenceId.2": { "$exists": true } } )
Run Code Online (Sandbox Code Playgroud)
或者
db.collection.aggregate([
{ "$match": { "sourceReferenceId.2": { "$exists": true } } }
])
Run Code Online (Sandbox Code Playgroud)