我正在运行下面的聚合函数。文档可能有也可能没有元素,我只想返回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}}确实反映了该值为空。
答案 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>