0

現在、mongodb 1.2.2 を使用してデータベースを作成し、値を保存しています。データ型は次のようになります。

"file" : "1" , "tools": { "foo": { "status": "pending"} }
"file" : "2" , "tools": { "bar": { "status": "pending" } }
"file" : "3" , "tools": { "foo": { "status": "running" } }
"file" : "4" , "tools": { "bar": { "status": "done" } }
"file" : "5" , "tools": { "foo": { "status": "done" } } 

foo とbar以外にもさまざまなバリエーションがあるため、使用したくあり{ "status" : "pending" }.ません。{"tools.foo.status" : "pending"}より明確にするために、このようなことをしたい{"tools.*.status" : "pending"}

4

3 に答える 3

1

いいえ、それはできません。このために独自のインデックスを維持する必要があるのではないかと思います。つまり、ファイルコレクションへの挿入/更新ごとに、file_status_indexコレクションへのアップサートを実行して現在のステータスを更新します。

クエリも2段階のプロセスです。最初にインデックスコレクションにクエリを実行してIDを取得し、次に$inファイルコレクションにクエリを発行して実際のデータを取得します。

これは恐ろしいように聞こえるかもしれませんが、それはこのスキーマで支払わなければならない代償です。

于 2012-07-09T20:58:21.983 に答える
1

まず、MongoDB をアップグレードする必要があります。1.2.2 は本当に古いバージョンです。

第二に、あなたが尋ねるクエリを実行することはできません。Map/Reduceでこれを行うことができます。

于 2012-07-10T06:14:22.703 に答える
0

なぜ今のように物を保管しているのかを尋ねる時が来たと思います。

この種の構造を効率的に検索する方法はありません。フィルタリングしている値に到達するための既知のキーのみのパスがないため、すべてのレコードを毎回展開する必要があり、特にコレクションが 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 } ]
于 2012-07-09T20:58:56.710 に答える