MongoDB:检索集合中的第一个文档

时间:2013-05-31 22:34:07

标签: mongodb

我是Mongo的新手,我正在尝试从find()查询中检索第一个文档:

> db.scores.save({a: 99});
> var collection = db.scores.find();
[ 
  {   "a" : 99,   "_id" : {   "$oid" : "51a91ff3cc93742c1607ce28"   }   }
]
> var document = collection[0];
JS Error: result is undefined

这有点奇怪,因为一个集合看起来很像一个数组。我知道使用findOne()检索单个文档,但是可以从集合中提取一个文档吗?

3 个答案:

答案 0 :(得分:11)

find方法返回一个游标。这类似于结果集中的迭代器。如果您有太多结果并尝试在屏幕上全部显示它们,则shell将仅显示前20个,并且光标现在将指向结果集的第20个结果。如果您输入it,则会显示接下来的20个结果,依此类推。

在你的例子中,我认为你在shell中隐藏了一行。

此命令

> var collection = db.scores.find();

只会将结果分配给collection变量,并且不会在屏幕上打印任何内容。所以,这让我相信你也跑了:

> collection

现在,真正发生了什么。如果您确实使用了上述命令来显示collection的内容,那么光标将到达结果集的末尾(因为您的集合中只有一个文档)并且它将自动关闭。这就是你找回错误的原因。

您的语法没有任何问题。您可以随时使用它。只需确保光标仍然打开并有结果。您可以使用collection.hasNext()方法。

答案 1 :(得分:1)

那是Mongo的外壳吗?什么版本?当我尝试你输入的命令时,我没有得到任何额外的输出:

MongoDB shell version: 2.4.3
connecting to: test
> db.scores.save({a: 99});
> var collection = db.scores.find();
> var document = collection[0];

在Mongo shell中,find()返回游标,而不是数组。在文档中,您可以看到methods you can call on a cursor

findOne()会返回单个文档,并且应该适用于您要完成的任务。

答案 2 :(得分:0)

所以你可以有几个选择。

使用Java作为语言,但一种选择是获取db游标并迭代返回的元素。或者只是抓住第一个并运行。

DBCursor cursor = db.getCollection(COLLECTION_NAME).find();
List<DOCUMENT_TYPE> retVal = new ArrayList<DOCUMENT_TYPE>(cursor.count());
while (cursor.hasNext()) {
    retVal.add(cursor.next());
}
return retVal;

如果您正在文档中查找特定对象,则可以编写查询并搜索所有文档。您可以使用findOne方法或只是查找并获取与查询匹配的对象列表。见下文:

DBObject query = new BasicDBObject();
query.put(SOME_ID, ID);
DBObject result = db.getCollection(COLLECTION_NAME).findOne(query) // for a single object
DBCursor cursor = db.getCollection(COLLECTION_NAME).find(query) // for a cursor of multiple objects