14

私は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

コレクションは配列によく似ているため、これは少し奇妙です。を使用して 1 つのドキュメントを取得することは認識してfindOne()いますが、コレクションから 1 つのドキュメントを取得することは可能ですか?

4

3 に答える 3

12

findメソッドはカーソルを返します。これは、結果セットの反復子のように機能します。結果が多すぎて画面にすべて表示しようとすると、シェルは最初の 20 個のみを表示し、カーソルは結果セットの 20 番目の結果を指すようになります。it次の 20 件を入力すると、結果が表示されます。

あなたの例では、シェルで1行を隠していると思います。

このコマンド

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

結果を変数に割り当てるだけcollectionで、画面には何も出力されません。だから、それはあなたも実行したと私に信じさせます:

> collection

さて、実際に何が起こっているのでしょう。上記のコマンドを実際に使用して のコンテンツを表示したcollection場合、カーソルは結果セットの最後に到達し (コレクション内にドキュメントが 1 つしかないため)、自動的に閉じます。そのため、エラーが返されます。

構文に問題はありません。いつでもご利用いただけます。カーソルがまだ開いていて、結果があることを確認してください。collection.hasNext()そのためにメソッドを使用できます。

于 2013-06-01T18:24:48.790 に答える
2

それは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 シェルでfind()は、配列ではなくカーソルを返します。ドキュメントでは、カーソルで呼び出すことができるメソッドを確認できます。

findOne()単一のドキュメントを返し、達成しようとしているものに対して機能するはずです。

于 2013-05-31T23:03:29.213 に答える
0

したがって、いくつかのオプションを使用できます。

Java を言語として使用しますが、1 つのオプションは、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
于 2013-05-31T22:51:41.300 に答える