如何匹配MongoDB中的子文档数组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何匹配MongoDB中的子文档数组?相关的知识,希望对你有一定的参考价值。
仅当同一文档包含等于某个值的字段时,如果子文档数组中的值大于某个值,则匹配文档
我有一个包含一系列子文档的文档的集合。该子文档数组包含一个字段,该字段指示我是否可以基于子文档中的另一个字段过滤集合中的文档。当您看到该文档的示例时,这会更有意义。
{
"_id":"ObjectId('XXX')",
"Data":{
"A":"",
"B":"-25.78562 ; 28.35629",
"C":"165"
},
"SubDocuments":[
{
"_id":"ObjectId('XXX')",
"Data":{
"Value":"XXX",
"DataFieldId":"B"
}
},
{
"_id":"ObjectId('XXX')",
"Data":{
"Value":"",
"DataFieldId":"A"
}
},
{
"_id":"ObjectId('XXX')",
"Data":{
"Value":"105",
"DataFieldId":"Z"
}
}
]
}
我只希望将包含子文档的文档与DataFieldId匹配,该DataFieldId等于Z,但只有在Data Field Id等于Z时才过滤大于105的值。
请尝试以下方式:
db.collection.aggregate([
{
$project: {
_id:1,
Data:1,
filteredSubDocuments: {
$filter: {
input: "$SubDocuments",
as: "subDoc",
cond: {
$and: [
{ $eq: ["$$subDoc.Data.DataFieldId", "Z"] },
{ $gte: ["$$subDoc.Data.Value", 105] }
]
}
}
}
}
}
])
结果回复将是:
{
"_id" : ObjectId("5cb09659952e3a179190d998"),
"Data" : {
"A" : "",
"B" : "-25.78562 ; 28.35629",
"C" : "165"
},
"filteredSubDocuments" : [
{
"_id" : "ObjectId('XXX')",
"Data" : {
"Value" : 105,
"DataFieldId" : "Z"
}
}
]
}
这可以通过在子文档上使用$elemMatch
运算符来完成,有关详细信息,您可以单击提供的链接。对于您的问题,您可以使用$elemMatch
尝试以下查询, db.collectionName.find({
"SubDocuments": {
$elemMatch: {
"Data.DataFieldId": "Z" ,
"Data.Value" : {$gte: 105}
}
} })
比聚合更简单:
SubDocuments.Data.Value
它工作正常,我已在本地验证,你需要的一个修改是你必须根据你的要求将Number
的值作为Long
或qazxswpoi。
以上是关于如何匹配MongoDB中的子文档数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Mongo DB 中的子文档数组中删除匹配条件的子文档
如何使用 C# 驱动程序更新 MongoDB 数组中的子文档
如何使用python脚本从mongoDB中检索数组中的子文档
如何使用python脚本从mongoDB中检索数组中的子文档