2015-10-13 8 views
6
に配列フィールドで、このMongoDBのドキュメントの

だと思うが、指定された要素のインデックスを取得しますか?MongoDBの

クエリで上記の2が返され、ドキュメント全体が返されません。

作業中のクエリを親切に表示してください。

答えて

5

MongoDBバージョン3.4からは、 e $indexOfArray演算子は、配列内の特定の要素を見つけるためのインデックスを返します。

$indexOfArrayには3つの引数があります。最初は$の接頭辞が付いた配列フィールドの名前です。

第2は要素であり、第3オプションは検索を開始するインデックスです。 $indexOfArrayは、検索を開始するインデックスが指定されていない場合、要素が見つかる最初のインデックスを返します。


デモ:

> db.collection.insertOne({ "_id" : 123, "food": [ "apple", "mango", "banana", "mango" ] }) 
{ "acknowledged" : true, "insertedId" : 123 } 
> db.collection.aggregate([ { "$project": { "matchedIndex": { "$indexOfArray": [ "$food", "mango" ] } } } ]) 
{ "_id" : 123, "matchedIndex" : 1 } 
> db.collection.aggregate([ { "$project": { "matchedIndex": { "$indexOfArray": [ "$food", "mango", 2 ] } } } ]) 
{ "_id" : 123, "matchedIndex" : 3 } 
> db.collection.aggregate([ { "$project": { "matchedIndex": { "$indexOfArray": [ "$food", "apricot" ] } } } ] ) 
{ "_id" : 123, "matchedIndex" : -1 } 
+0

この回答はバージョン3に最適です。4 +が、古いバージョンを使用している場合は、@ BlakesSeven –

4

本当にmapReduceを使用するよりも、他の方法(「サーバ側」)はありません。

db.collection.mapReduce(
    function() { 
     emit(this._id, this.food.indexOf("mango")); 
    }, 
    function() {}, // reducer never gets called since all _id is unique 
    { 
     "out": { "inline": 1 }, 
     "query": { "food": "mango" } 
    } 
) 

それは、文書そのものよりも、他の改変された形態で、何か他のものを返します唯一のものです

残念ながらこれを行う「ネイティブ」演算子はありません。

実際の集約の目的でこれを必要としない限り、「ドキュメントごと」の基準を扱うときは、クライアントのネイティブコードで同様の「配列インデックス一致」を実行する方が良いです。モンゴシェルで

+0

は魅力のように働きました!しかし、mapReduceを呼び出すと、大きなコレクションのパフォーマンスはどうですか? –

+0

@JamesYang私はあなたが実際に結果をさらに集計する必要がないかぎり(すでに述べたように)、あなたはこれをやっているべきではないと思うという点を理解する必要があると思います。サーバサイドの代替(これも既に述べられている)はありません。したがって、あなたは「サーバ側」のケースでmapReduceに悩まされているか、(すでに推奨されているように)クライアント内のドキュメントごとの配列のインデックスを処理します。 –

+0

'{jsMode:true}'オプションでは、それはパフォーマンスには良いですか?あなたの経験では –

0

(Robomongoでも)私は、次の操作を行います。

var food = db.getCollection('yourCollection').findOne({_id: '123'}).food; 
    print('Index of mango: ' + food.indexOf('mango')); 

か、any_file.jsにこのコードを保存し、コマンドラインから実行することができます

mongo your_db any_file.js 

それが生成されます

MongoDB shell version: 2.4.9 
    connecting to: localhost:27017/your_db 
    Index of mango: 2 
+0

解決策ですが、実際にはそうでないかもしれません –