在第一种方法中,由于id用作键,所以不能为id字段编制索引.它有点像键值字典.如果您拥有一组已知的ID(当然数量较少),这种方法非常有用.假设在第一个示例中,前面的id是众所周知的,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
因此,要找到id字段idk73716的值,可以通过
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
空的{}表示查询,第二部分{'lines.idk73716':1}是查询 Select 器.
having ids as keys having an advantage of picking the particular field alone.尽管{'lines.idk73716':1}是一个字段 Select 器,但在这里它充当查询和 Select 器.但这不能在你的第二种方法中实现.假设第二个系列是这样的
> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>
您为字段id编制了索引,所以如果您想按id进行查询
> db.second_collection.find({'lines.id' : 'idk73716' })
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>
通过查看上述输出,可以看出无法单独 Select 匹配的子(嵌入)文档,但在第一种方法中是可能的.这是mongodb的默认行为.
看见
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
将获取所有行,而不仅仅是idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
希望这有帮助
EDIT
感谢@Gates VP的指点
db.your_collection.find({'lines.idk73716':{$exists:true}})
.如果你
我们仍然可以使用$exists来查询id,但它将不可索引