27

mongoコレクションで選択したドキュメントの位置(インデックス)を取得するにはどうすればよいですか?

例:このドキュメント:db.myCollection.find({"id":12345}) インデックス3がありますmyCollection

myCollection:
    id: 12340, name: 'G'
    id: 12343, name: 'V'
    id: 12345, name: 'A'
    id: 12348, name: 'N'
4

6 に答える 6

42

順序に関係なくドキュメントの位置を見つけることが要件である場合、MongoDb はドキュメントを特定の順序で保存しないため、これは不可能です。ただし、たとえば、あるフィールドに基づいてインデックスを知りたい場合は、_idこの方法を使用できます。

あなたの_id分野で自動インクリメントに厳密に従っている場合。それよりも小さい値を持つすべてのドキュメントを数えることができます_id。たとえば、n とすると、n + 1 は に基づくドキュメントのインデックスになります_id

n = db.myCollection.find({"id": { "$lt" : 12345}}).count() ;

これは、ドキュメントがコレクションから削除された場合にも有効です。

于 2012-05-30T11:17:38.683 に答える
4

私の知る限り、これを行うための単一のコマンドはなく、これは一般的なケースでは不可能です (Derick の回答を参照)。ただし、count()順序付けされた id 値フィールドで実行されたクエリに使用すると機能するようです。警告: これは、確実に順序付けられたフィールドがあることを前提としていますが、これは同時ライターの場合には実現が困難です。この例_idでは が使用されていますが、これは単一のライター ケースでのみ機能します。:

MongoDB shell version: 2.0.1
connecting to: test
> use so_test
switched to db so_test
> db.example.insert({name: 'A'})
> db.example.insert({name: 'B'})
> db.example.insert({name: 'C'})
> db.example.insert({name: 'D'})
> db.example.insert({name: 'E'})
> db.example.insert({name: 'F'})
> db.example.find()
{ "_id" : ObjectId("4fc5f040fb359c680edf1a7b"), "name" : "A" }
{ "_id" : ObjectId("4fc5f046fb359c680edf1a7c"), "name" : "B" }
{ "_id" : ObjectId("4fc5f04afb359c680edf1a7d"), "name" : "C" }
{ "_id" : ObjectId("4fc5f04dfb359c680edf1a7e"), "name" : "D" }
{ "_id" : ObjectId("4fc5f050fb359c680edf1a7f"), "name" : "E" }
{ "_id" : ObjectId("4fc5f053fb359c680edf1a80"), "name" : "F" }
> db.example.find({_id: ObjectId("4fc5f050fb359c680edf1a7f")})
{ "_id" : ObjectId("4fc5f050fb359c680edf1a7f"), "name" : "E" }
> db.example.find({_id: {$lte: ObjectId("4fc5f050fb359c680edf1a7f")}}).count()
5
> 

クエリされたフィールドがインデックス化されている場合、これもかなり高速です。この例は mongo シェルにcount()ありますが、すべてのドライバー ライブラリでも利用できるはずです。

于 2012-05-30T10:06:47.693 に答える
3

これは非常に時間がかかるかもしれませんが、簡単な方法です。ここでは、通常のクエリとして渡すことができます。すべてのドキュメントをループして、条件がレコードに一致するかどうかを確認しています。ここでは _id フィールドでチェックしています。他の単一フィールドまたは複数フィールドを使用してチェックできます。

var docIndex = 0;
db.url_list.find({},{"_id":1}).forEach(function(doc){
  docIndex++;
  if("5801ed58a8242ba30e8b46fa"==doc["_id"]){
    print('document position is...' + docIndex);
    return false;
  }
});
于 2016-10-17T03:03:11.560 に答える
1

MySQL fe が行番号を指定しないのと同様に、MongoDB はデータベース内でドキュメントを順番に保持しないため、これを返す方法はありません。

jhonkola の ObjectID トリックは、1 つのクライアントのみが新しい要素を作成する場合にのみ機能します。これは、ObjectID がクライアント側で生成され、最初の部分がタイムスタンプであるためです。異なるクライアントが同じサーバーと通信する場合、順序は保証されません。それでも、私はこれに頼りません。

また、あなたが何をしようとしているのかよくわかりませんので、質問でそれについて言及してください。その後、回答を更新できます。

于 2012-05-30T10:11:12.233 に答える