如果使用mongodb $ map在文档中存在元素,我该如何返回true / false?

时间:2017-01-13 14:12:45

标签: mongodb

我正在运行下面的聚合函数。文档可能有也可能没有元素,我只想返回true / false。如果元素存在,则元素很大,因此返回整个元素会产生许多问题而且不需要。

为了解决这个问题,我在版本3.0.4的生产环境中,目前升级到3.4不是一个选项,尽管看起来该版本有更好的解决方案。

为了测试这个,我在集合exists中有一个文档。该文档有一个元素notexists,它是一个包含其他元素的对象。它没有名为db.runCommand({ "aggregate": "mycollection", "pipeline": [{ "$match": {...} }, { "$sort": {...} }, { "$group": {...} }, { "$limit": 10 }, { "$project": { "aggregated": { "$map": { "input": "$mycollection", "as": "document", "in": { "exists_test":{"$eq":["$$document.exists",null]}, "not_exists_test":{"$eq":["$$document.notexists",null]}, "exists_test_ifnull":{"$ifNull":["$$document.exists","test"]}, "not_exists_test_ifnull":{"$ifNull":["$$document.notexists","test"]}, "exists_content": "$$document.exists" ... } } }, "success": { "$cond": { "if": { "$gt": ["$status", 0] }, "then": "false", "else": "true" } } } }] })

的元素
{
    aggregated: [{
        "exists_test": false, (correct)
        "not_exists_test": false, (wrong)
        "exists_test_ifnull": content from document.exists, (correct)
        "not_exists_test_ifnull": "test", (correct)
        "exists_content": content from document.exists, (correct)
    }]
}

不幸的是,这会返回一个文档:

"not_exists_test":{"$eq":["$$document.notexists",null]},

似乎$ifNull应该返回true,因为{{1}}确实反映了该值为空。

2 个答案:

答案 0 :(得分:2)

尝试使用BSON types comparison order中隐含的"not_exists_test": { "$gt": ["$$document.notexists", null] }

答案 1 :(得分:0)

对于Mongodb 3.2,它使用单个$符号,

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8"/>
      <style>
         table,th,td {
         border : 1px solid black;
         border-collapse: collapse;
         }
         th,td {
         padding: 5px;
         }
      </style>
   </head>
   <body>
      <button type="button" onclick="loadXMLDoc()">Get my results</button>
      <br><br>
      <table id="demo"></table>
      <script>
         function loadXMLDoc() {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
              myFunction(this);
            }
          };

          xmlhttp.open("GET", "Assertion_Results.xml", true);
          xmlhttp.send();
         }
         function myFunction(xml) {
          var i;
          var xmlDoc = xml.responseXML;
          var table="<tr><th>Intent</th><th>Input</th><th>Entity</th></tr>";
          var x = xmlDoc.getElementsByTagName("httpSample");
          for (i = 0; i <x.length; i++) {
            table += "<tr><td>" +
            x[i].getElementsByTagName("assertionResult")[0].childNodes[3].nodeValue +
            "</td><td>" +
            x[i].getElementsByTagName("assertionResult")[1].childNodes[3].nodeValue +
            "</td><td>"+
            x[i].getElementsByTagName("assertionResult")[2].childNodes[3].nodeValue +
            "</td></tr>";
          }
          document.getElementById("demo").innerHTML = table;
         }
      </script>
   </body>
</html>