MongoDB:查询,返回至少包含部分Select字段的文档

时间:2014-02-01 23:33:29

标签: mongodb select find

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的单个查询中获得我想要的内容?

2 个答案:

答案 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