我正在Mongo中存储某种文件系统,其中目录被命名为类别。
目录JSON如下:
{
"name":"CategoryChildLevel2",
"parentId":"2",
"otherAttribute":"anyVal",
"breadcrumb":[
{
"name":"RootCategory",
"id":"1"
},
{
"name":"CategoryChildLevel1",
"id":"2"
}
]
}
FS类别通过parentId属性链接在一起。
我需要显示类别面包屑。通过用户导航,我们可以知道我们在FS上的位置,但是类别可以通过它们的ID(书签类别,搜索引擎…)直接访问,而不需要任何FS导航。为了避免对DB的递归调用,为了能够得到面包屑,我对它进行了反规范化。
问题是这个面包屑很难保持最新,因为顶级类别可以移动,因此它的所有子面包屑必须更新。可能有许多子类别需要更新,并且有不同的方法来处理这个问题。其中一些是安全的,但代价高昂(递归),另一些更快,但可能导致一些不一致。
这里我想知道的是,如果有可能做一个查询来检索有一个坏面包屑的类别。我需要一个允许这样做的查询:
检索不包含:last数组元素的所有类别面包屑。id = parentId
我不认为"最后一个数组元素"部分是可能的,但它也会很好,能够做到:
检索所有没有:面包屑。id包含parentId
任何解决方案,可在Scala或Java驱动程序?我用的是Salat/Casbah
这个问题可以帮助你理解我所面临的问题:你会使用哪个数据库?MongoDB/Neo4j/SQL……所有人?
您可以使用$where
运算符执行 Retrieve all the categories that do not have: last array element breadcrumb.id = parentId
查询:
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'
})