なぜ今のように物を保管しているのかを尋ねる時が来たと思います。
この種の構造を効率的に検索する方法はありません。フィルタリングしている値に到達するための既知のキーのみのパスがないため、すべてのレコードを毎回展開する必要があり、特にコレクションが RAM に収まらなくなった場合は非常にコストがかかります。
IMO、これらのステータスを保持するには、セカンダリ コレクションを使用する方がよいでしょう。はい、データストアがよりリレーショナルになりますが、それはデータがリレーショナルだからです。
file_tools:
{ 'file_id' : 1, 'name' : 'foo', 'status' : 'pending' }
{ 'file_id' : 2, 'name' : 'bar', 'status' : 'pending' }
{ 'file_id' : 3, 'name' : 'foo', 'status' : 'running' }
{ 'file_id' : 4, 'name' : 'foo', 'status' : 'done' }
{ 'file_id' : 5, 'name' : 'foo', 'status' : 'done' }
files:
{ 'id': 1 }
{ 'id': 2 }
{ 'id': 3 }
{ 'id': 4 }
{ 'id': 5 }
> // find out which files have pending tools
> files_with_pending_tools = file_tools.find( { 'status' : 'pending' }, { 'file_id' : 1 } )
> //=> [ { 'file_id' : 1 }, { 'file_id' : 2 } ]
>
> // just get the ids
> file_ids_with_pending_tools = files_with_pending_tools.map( function( file_tool ){
> file_tool['file_id']
> })
> //=> [1,2]
>
> // query the files
> files.find({'id': { $in : file_ids_with_pending_tools }})
> //=> [ { 'id' : 1 }, { 'id' : 2 } ]