だと思うが、指定された要素のインデックスを取得しますか?MongoDBの
クエリで上記の2
が返され、ドキュメント全体が返されません。
作業中のクエリを親切に表示してください。
だと思うが、指定された要素のインデックスを取得しますか?MongoDBの
クエリで上記の2
が返され、ドキュメント全体が返されません。
作業中のクエリを親切に表示してください。
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 }
本当に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" }
}
)
それは、文書そのものよりも、他の改変された形態で、何か他のものを返します唯一のものです
残念ながらこれを行う「ネイティブ」演算子はありません。
実際の集約の目的でこれを必要としない限り、「ドキュメントごと」の基準を扱うときは、クライアントのネイティブコードで同様の「配列インデックス一致」を実行する方が良いです。モンゴシェルで
は魅力のように働きました!しかし、mapReduceを呼び出すと、大きなコレクションのパフォーマンスはどうですか? –
@JamesYang私はあなたが実際に結果をさらに集計する必要がないかぎり(すでに述べたように)、あなたはこれをやっているべきではないと思うという点を理解する必要があると思います。サーバサイドの代替(これも既に述べられている)はありません。したがって、あなたは「サーバ側」のケースでmapReduceに悩まされているか、(すでに推奨されているように)クライアント内のドキュメントごとの配列のインデックスを処理します。 –
'{jsMode:true}'オプションでは、それはパフォーマンスには良いですか?あなたの経験では –
(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
解決策ですが、実際にはそうでないかもしれません –
この回答はバージョン3に最適です。4 +が、古いバージョンを使用している場合は、@ BlakesSeven –