3

ある種のファイルシステムをMongoに保存しており、ディレクトリにはカテゴリという名前が付けられています。

カテゴリJSONは次のようになります。

{
   "name":"CategoryChildLevel2",
   "parentId":"2",
   "otherAttribute":"anyVal",
   "breadcrumb":[
      {
         "name":"RootCategory",
         "id":"1"
      },
      {
         "name":"CategoryChildLevel1",
         "id":"2"
      }
   ]
}

FSカテゴリは、parentId属性でリンクされています。

カテゴリブレッドクラムを表示する必要があります。ユーザーナビゲーションを通じて、FSのどこにいるかを知ることができますが、カテゴリには、FSナビゲーションなしで、ID(ブックマークされたカテゴリ、検索エンジンなど)から直接アクセスできます。DBへの再帰的な呼び出しを回避し、ブレッドクラムを取得できるようにするために、非正規化しました。


問題は、このブレッドクラムを最新の状態に保つのが難しいことです。これは、トップレベルのカテゴリを移動できるため、そのすべての子ブレッドクラムを更新する必要があるためです。更新する子カテゴリは多数ある可能性があり、この問題に対処するにはさまざまな方法があります。それらのいくつかは安全ですが高価(再帰)であり、他のものはより高速ですがいくつかの不整合につながる可能性があります。


ここで私が知りたいのは、悪いブレッドクラムを持つカテゴリを取得するためのクエリを実行できるかどうかです。次のことを許可するクエリが必要です。

持っていないすべてのカテゴリを取得します:最後の配列要素breadcrumb.id = parentId

「最後の配列要素」の部分は可能ではないと思いますが、次のことができると便利です。

持っていないすべてのカテゴリを取得します。breadcrumb.idにはparentIdが含まれています

ScalaまたはJavaドライバーで利用可能なソリューションはありますか?私はSalat/Casbahを使用しています。

この質問は、私が直面していることを理解するのに役立つ場合があります。どのDBを使用しますか?MongoDB / Neo4j / SQL ...それらすべて?

4

1 に答える 1

3

演算子を使用してRetrieve all the categories that do not have: last array element breadcrumb.id = parentIdクエリを実行できます。$where

db.test.find({
    // Find docs were breadcrumb is empty or its last element's id != parentId
    $where: '!this.breadcrumb.length || this.breadcrumb[this.breadcrumb.length-1].id !== this.parentId' 
})
于 2013-01-03T03:27:41.210 に答える