我有一个看起来像这样的收藏集:
{
"value" : "20",
"type" : "square",
"name" : "form1"
}
{
"value" : "24",
"type" : "circle",
"name" : "form2"
}
{
"value" : "12",
"type" : "square",
"name" : "form3"
}
我想用name = form2
提取文档,所以我输入:
db.myCollec.find({"name":"form2"} , {"name":1, "type":1, "_id":0})
结果是:
{ "name" : "form2", "type" : "circle" }
现在,如果要查找带有name = form4
的文档,请输入:
db.myCollec.find({"name":"form4"} , {"name":1, "type":1, "_id":0})
但这不会返回任何内容,因为没有使用该名称的文档。
但是我希望返回值看起来像这样:
{ "name" : "form4", "type" : null }
我该怎么做?
答案 0 :(得分:1)
您可以使用以下汇总
如果在查询中找不到$match
个数据,则Mongodb不会产生结果。
但是您可以使用$facet
聚合来处理单个阶段中的多个聚合管道。
因此,首先使用$facet
获取$match
版本的文档,如果找不到($project
)数据,则使用$ifNull
ion。
let searchTerm = "form2"
db.myCollec.aggregate([
{ "$facet": {
"data": [
{ "$match": { "name": searchTerm }},
{ "$project": { "name": 1, "type": 1, "_id": 0 }}
]
}},
{ "$project": {
"name": {
"$ifNull": [{ "$arrayElemAt": ["$data.name", 0] }, searchTerm ]
},
"type": {
"$ifNull": [{ "$arrayElemAt": ["$data.type", 0] }, null]
}
}}
])
答案 1 :(得分:0)
为什么如果result == null则不签入回调并创建自己的空对象?
let name = "form4";
db.myCollec.find({"name":name} , {"name":1, "type":1, "_id":0}, function(err, result){
if(err) {
// Error handling
return;
}
if (result==null){
result = {"name":name, "type":null};
}
});