【问题标题】:Mongodb find() only include non-empty arraysMongodb find() 只包含非空数组
【发布时间】: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) {});

但这没有任何回报

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

干杯

【问题讨论】:

    标签: javascript node.js mongodb mongoose aggregation-framework


    【解决方案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) {
    
    
         }
    );
    

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 2019-10-26
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多