Mongodb find() 只包含非空数组

Posted

技术标签:

【中文标题】Mongodb find() 只包含非空数组【英文标题】:Mongodb find() only include non-empty arrays 【发布时间】:2014-09-07 17:23:45 【问题描述】:

我试图通过查找查询实现的是,如果它的内部数组不为空,则只包含“someArray”。例如下面的 JSON:


  "document": "some document",
  "someArray": [
    
      "innerArray": [
        "not empty"
      ]
    ,
    
      "innerArray": [
        [] //empty
      ]
    
  ]

会返回这个:


  "document": "some document",
  "someArray": [
    
      "innerArray": [
        "not empty"
      ]
    
  ]

我正在使用以下查找:

Visit.find('someArray.innerArray.0': $exists: true, function(err, data));

但是,这会返回所有数据。

也试过了:

Visit.find(, 'someArray.innerArray': $gt: 0, function(err, data) );

但这没有任何回报

关于如何解决这个问题的任何想法?

干杯

【问题讨论】:

【参考方案1】:

这里检查非空数组的一般情况是检查“第一个”元素是否确实存在。对于单个匹配项,您可以使用 positional $ 运算符进行投影:

Vist.find(
     "someArray.innerArray.0":  "$exists": true  ,
     "document": 1,"someArray.$": 1,
    function(err,data) 

    
);

如果您需要多个匹配项或数组嵌套比这更深,那么aggregation framework 是您处理更难的投影和/或“过滤”多个匹配项的数组结果所需要的:

Visit.aggregate(
    [
        // Match documents that "contain" the match
         "$match": 
            "someArray.innerArray.0":  "$exists": true 
        ,

        // Unwind the array documents
         "$unwind": "$someArray" ,

        // Match the array documents
         "$match": 
            "someArray.innerArray.0":  "$exists": true 
        ,

        // Group back to form
         "$group": 
            "_id": "$_id",
            "document":  "$first": "$document" ,
            "someArray":  "$push": "$someArray" 
        

    ],function(err,data) 


    
)

在这里值得注意的是,您将其称为“空”,但实际上并非如此,因为它实际上包含另一个空数组。您可能不想对真实数据执行此操作,但如果您有,则需要像这样进行过滤:

Visit.aggregate(
    [
         "$match": 
            "someArray":  "$elemMatch":  "innerArray.0":  "$ne": []   
        ,
         "$unwind": "$someArray" ,
         "$match": 
            "someArray.innerArray.0":  "$ne": [] 
        ,
         "$group": 
            "_id": "$_id",
            "document":  "$first": "$document" ,
            "someArray":  "$push": "$someArray" 
        
     ],function(err,data) 


     
);

【讨论】:

以上是关于Mongodb find() 只包含非空数组的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb查找比较数组元素

给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

NoSQL介绍

MongoDB pymongo模块 查询

MongoDB入门学习

MongoDB各种查询操作详解