find()函数是MongoDB内置的函数,用来为用户重算数据,该函数有2个可选参数:
参数1、一种查询规范
参数2、要返回的列(即属性)
例如:
mongos> db.foo.find({ attr2: 3})
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }
这个命令是查询c1值为3的所有对象。attr2属性没有索引,但可以对其进行查询。如果要强制使用_id key,只需要按如下命令操作即可(当然读者在操作时对象可能会有所不同):
mongos> db.foo.find({ _id: ObjectId("4ea52a5035a81331e048baab")})
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }
最后,可以通过使用explain()使上文提到的后两个查询结果更具体(这里只为演示该功能,可能读者并不需要):
mongos> db.foo.find({ attr2: 3}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 6,
"nscannedObjects" : 6,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
{
"cursor" : "BasicCursor",
"nscanned" : 6,
"nscannedObjects" : 6,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
返回结果为一个JavaScript对象。对于要查询属性来说,属性attr2没有索引,因此在查询时会扫描所有的对象,如下所示:
mongos> db.foo.find({ _id: ObjectId("4ea52a5035a81331e048baab")}).explain()
{
"cursor" : "BtreeCursor _id_",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 22,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"_id" : [
[
ObjectId("4ea52a5035a81331e048baab"),
ObjectId("4ea52a5035a81331e048baab")
]
]
}
}
{
"cursor" : "BtreeCursor _id_",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 22,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"_id" : [
[
ObjectId("4ea52a5035a81331e048baab"),
ObjectId("4ea52a5035a81331e048baab")
]
]
}
}
这里只查看了一个对象,要获取数据,需要使用id列来查找(查看indexBounds属性)。
可以看到,除了那些对象与JavaScript,查询操作与我们平时使用的RDBMS并没有什么不同。