Mongodb 如何查找数组中包含一定数量嵌入/嵌套文档的文档

Mongodb 如何查找数组中包含一定数量嵌入/嵌套文档的文档,mongodb,Mongodb,我想知道是否可以根据数组中嵌套文档的数量来选择文档 例如,我的查询是否可以选择任何文档的URL,该文档在部分中包含少于或等于2个嵌套文档,并且具有类型:段落?在下面的文档中,我希望返回第一个对象,而不是第二个 { "_id":ObjectId( "5e2aafb6143f79b18d27bf7a" ), "metadata":{ "language":"en-gb", "timestamp":1517225687000, "url":

我想知道是否可以根据数组中嵌套文档的数量来选择文档

例如,我的查询是否可以选择任何文档的URL,该文档在
部分
中包含少于或等于2个嵌套文档,并且具有
类型:段落
?在下面的文档中,我希望返回第一个对象,而不是第二个

{ 
   "_id":ObjectId(   "5e2aafb6143f79b18d27bf7a"   ),
   "metadata":{ 
      "language":"en-gb",
      "timestamp":1517225687000,
      "url": "foo.com"
   },
   "body":{ 
      "sections":[ 
         { 
            "href":"http://test.co.uk/test.png",
            "type":"image"
         },
         { 
            "text":"Lorem ipsum dolor sit amet",
            "type":"paragraph"
         },
         { 
            "text":"consectetur adipiscing elit",
            "type":"paragraph"
         }
      ]
   }
}

{ 
   "_id":ObjectId(   "5e2aafd8143f79b18d27bf7b"   ),
   "metadata":{ 
      "language":"en-gb",
      "timestamp":1517225687000,
      "url": "bar.com"
   },
   "body":{ 
      "sections":[ 
         { 
            "href":"http://test.co.uk/test.png",
            "type":"image"
         },
         { 
            "text":"Lorem ipsum dolor sit amet",
            "type":"paragraph"
         },
         { 
            "text":"consectetur adipiscing elit",
            "type":"paragraph"
         },
         { 
            "text":"Integer ut ligula diam",
            "type":"paragraph"
         }
      ]
   }

我已经在MongoDB网站上阅读了教程中的查询文档部分,但不知道如何将类似的内容组合在一起。

您可以通过混合使用
$expr
$lte
$size
$filter
,来达到预期的效果,通过使用此聚合,无需创建新字段:

db.your\u collection\u name.aggregate([
{
“$match”:{
“$expr”:{
“$lte”:[
{
//获取已筛选数组的大小
“$size”:{
//段落类型的过滤部分
“$filter”:{
“输入”:“$body.sections”,
“作为”:“部分”,
“条件”:{
“$eq”:[“$$section.type”,“段落”]
}
}
}
},
2.
]
}
}
}
])
结果如下所示:


您可以通过混合使用
$expr
$lte
$size
&
$filter
,通过使用此聚合,而无需创建新字段,来实现您期望的结果:

db.your\u collection\u name.aggregate([
{
“$match”:{
“$expr”:{
“$lte”:[
{
//获取已筛选数组的大小
“$size”:{
//段落类型的过滤部分
“$filter”:{
“输入”:“$body.sections”,
“作为”:“部分”,
“条件”:{
“$eq”:[“$$section.type”,“段落”]
}
}
}
},
2.
]
}
}
}
])
结果如下所示:


您可以使用检查数组是否有
n
或更多元素。并且,您可以使用以下合适的语法投影所需字段:。谢谢@prasad\我来试试。您可以使用检查数组是否有
n
或更多元素。而且,您可以使用以下合适的语法投影所需字段:。谢谢@prasad_389;,我来试试。
[
  {
    "_id": "5e2aafb6143f79b18d27bf7a",
    "body": {
      "sections": [
        {
          "href": "http://test.co.uk/test.png",
          "type": "image"
        },
        {
          "text": "Lorem ipsum dolor sit amet",
          "type": "paragraph"
        },
        {
          "text": "consectetur adipiscing elit",
          "type": "paragraph"
        }
      ]
    },
    "metadata": {
      "language": "en-gb",
      "timestamp": 1.517225687e+12,
      "url": "foo.com"
    }
  }
]