我是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()
检索单个文档,但是可以从集合中提取一个文档吗?
答案 0 :(得分:11)
find
方法返回一个游标。这类似于结果集中的迭代器。如果您有太多结果并尝试在屏幕上全部显示它们,则shell将仅显示前20个,并且光标现在将指向结果集的第20个结果。如果您输入it
,则会显示接下来的20个结果,依此类推。
在你的例子中,我认为你在shell中隐藏了一行。
此命令
> var collection = db.scores.find();
只会将结果分配给collection
变量,并且不会在屏幕上打印任何内容。所以,这让我相信你也跑了:
> collection
现在,真正发生了什么。如果您确实使用了上述命令来显示collection
的内容,那么光标将到达结果集的末尾(因为您的集合中只有一个文档)并且它将自动关闭。这就是你找回错误的原因。
您的语法没有任何问题。您可以随时使用它。只需确保光标仍然打开并有结果。您可以使用collection.hasNext()
方法。
答案 1 :(得分:1)
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