EG。 收藏: {a:1,b:2,c:3} {a:11,b:12,c:13} {a:111,b:122}
查询: db.records.find({},{b,c})
我想在这里得到的是这样的: {b:2,c:3} {b:12,c:13} {b:122,c:null}
但我只得到: {b:2,c:3} {b:12,c:13}
是否有可能在Mongo的单个查询中获得我想要的内容?
答案 0 :(得分:2)
预测(find
命令中的第二个参数)应采用以下格式:{ b: 1, c: 1 }
我的输出类似于您正在寻找的语法:
> db.records.find( { }, { _id: 0, b: 1, c: 1 } )
{ "b" : 2, "c" : 3 }
{ "b" : 12, "c" : 13 }
{ "b" : 122 }
答案 1 :(得分:0)
可以使用aggregate和$ifNull运算符完成此操作:
db.records.aggregate([{$project: { _id: 0, b: 1, c: {$ifNull: ["$c" , null ]} }}])
仍然值得解释null
的一般效果,因为文档中是否存在密钥或者文档是否包含null
之间存在差异。请考虑以下查询输出:
> db.records.find({},{ _id: 0, b:1, c:1})
{ "b" : 2, "c" : 3 }
{ "b" : 12, "c" : 13 }
{ "b" : 122 }
> db.records.find({ c:{$exists: true}},{ _id: 0, b:1, c:1})
{ "b" : 2, "c" : 3 }
{ "b" : 12, "c" : 13 }
> db.records.find({ c:{$exists: false}},{ _id: 0, b:1, c:1})
{ "b" : 122 }
>
这显示了仅针对b和c字段的投影的查询,因此这是第一个实例中返回的内容。返回第三个文件是因为我们没有限制我们刚刚预测。使用 $ exists 作为查询修饰符,可以对其进行过滤,因为其中一个文档中不存在c字段。
让我们假设我们改变第三个文档,然后再次查看查询:
> db.records.update({ _id: ObjectId("52ed85ecb87e33d680adb0fa") }, {$set: { c: false }})
> db.records.find({},{ _id: 0, b:1, c:1})
{ "b" : 2, "c" : 3 }
{ "b" : 12, "c" : 13 }
{ "b" : 122, "c" : false }
> db.records.find({ c:{$exists: true}},{ _id: 0, b:1, c:1})
{ "b" : 2, "c" : 3 }
{ "b" : 12, "c" : 13 }
{ "b" : 122, "c" : false }
> db.records.find({ c: true },{ _id: 0, b:1, c:1})
>
> db.records.find({ c: false },{ _id: 0, b:1, c:1})
{ "b" : 122, "c" : false }
>
因此,在为c设置 false 值后,我们可以在结果中看到该字段。它响应存在运算符,因为它在那里,如果查询被更改为过滤结果,它将根据需要返回。
有关该链接的更多信息: http://docs.mongodb.org/manual/faq/developers/#faq-developers-query-for-nulls