3

我在 Mongo 中存储某种文件系统,其中目录被命名为类别。

JSON 类别如下所示:

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

FS 类别与 parentId 属性链接在一起。

我需要显示类别面包屑。通过用户导航,我们可以知道我们在FS上的位置,但是类别可以通过他们的ID(书签类别,搜索引擎...)直接访问,无需任何FS导航。为了避免对数据库的递归调用,为了能够获得面包屑,我对它进行了非规范化。


问题是这个面包屑很难保持最新,因为可以移动顶级类别,因此必须更新其所有子面包屑。可以有许多子类别要更新,并且有不同的方法来处理这个问题。其中一些安全但昂贵(递归),另一些更快但可能导致一些不一致。


这里我想知道的是是否可以进行查询以检索具有坏面包屑的类别。我需要一个允许这样做的查询:

检索所有没有的类别:最后一个数组元素 breadcrumb.id = parentId

我认为“最后一个数组元素”部分是不可能的,但能够做到这一点也很好:

检索所有没有的类别:breadcrumb.id contains parentId

任何解决方案,在 Scala 或 Java 驱动程序中可用?我正在使用 Salat/Casbah。

这个问题可能会帮助您了解我所面临的问题:您将使用哪个数据库?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 回答