我有一个像
这样的文件{
"_id": ObjectId('56a77bfae0ce9f6a738cb2b7'),
"nameIdentity": [
{
"givenNameOne": "LATANYA",
"givenNameThree": "BIZOR",
"lastName": "BIZOR",
"sourceReferenceId": [
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "A"
},
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "B"
}
]
}
]
}
nameIdentity是一个数组,sourceReferenceId是nameIdentity中的嵌套数组。我试图获取sourceReferenceId大小大于2的文档。 我用这样的聚合:
db.entity.aggregate(
[
{
$project: {
nameIdentity_count: {$size: "$nameIdentity.sourceReferenceId"}
}
},
{
"$match": {
"nameIdentity_count": { "$gte": 2 }
}
}
]
)
这没有按预期工作,它甚至用一个soureReferenceId给文件。任何人都可以告诉我哪里出错了?
答案 0 :(得分:4)
您需要使用dot notation和$exists
运算符。如果你想要的只是find()
那些" sourceReferenceId"那么你也不需要聚合。大小大于2
db.collection.find( { "nameIdentity.sourceReferenceId.2": { "$exists": true } } )
但如果您确实需要汇总数据,那么:
db.collection.aggregate([
{ "$match": { "nameIdentity.sourceReferenceId.2": { "$exists": true } } }
])
另外,你有一个设计问题,因为有一个值总是一个元素数组的字段没有任何意义。您应该考虑更改文档结构,使其如下所示:
{
"_id": ObjectId('56a77bfae0ce9f6a738cb2b7'),
"givenNameOne": "LATANYA",
"givenNameThree": "BIZOR",
"lastName": "BIZOR",
"sourceReferenceId": [
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "A"
},
{
"sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
"sourceName": "B"
}
]
}
根据您尝试做的事情,使用以下查询。
db.collection.find( { "sourceReferenceId.2": { "$exists": true } } )
或
db.collection.aggregate([
{ "$match": { "sourceReferenceId.2": { "$exists": true } } }
])
答案 1 :(得分:1)
您需要使用 $size
获取 items 数组的大小,使用 $gt
将 items 数组的大小与 0 进行比较。
db.collection.find({"items":{$gt:[{$size:"items"},0]}})
答案 2 :(得分:0)
您可以在$size上使用$ gt。返回字段“items”的长度大于1的所有文档:
db.collection.find({"items": {$gt: {$size: 1}}})