Mongodb 检索具有包含其他文档属性的数组的文档

Mongodb 检索具有包含其他文档属性的数组的文档,mongodb,casbah,salat,Mongodb,Casbah,Salat,我在Mongo中存储某种文件系统,其中目录被命名为类别 类别JSON如下所示: { "name":"CategoryChildLevel2", "parentId":"2", "otherAttribute":"anyVal", "breadcrumb":[ { "name":"RootCategory", "id":"1" }, { "name":"CategoryChildLev

我在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包含parentId

有没有Scala或Java驱动程序提供的解决方案? 我用的是沙拉/卡斯巴

这个问题可能有助于您理解我面临的问题:

您可以使用操作符执行
检索所有没有的类别:last array element breadcrumb.id=parentId
查询:

db.test.find({
//Find docs were breadcrumb为空或其最后一个元素的id!=parentId
$where:'!this.breadcrumb.length | | this.breadcrumb[this.breadcrumb.length-1].id!==this.parentId'
})

没有人知道任何解决方案?如何创建树始终取决于您的查询需求。您需要如何搜索此树?类别当前是否与FS的文件列表分开,以便您有一个
类别的集合
,然后是一个
文件
?不幸的是,在大多数数据库中,树不是一件容易的事情,通常在查找或更新时都需要递归,最有效的是适合您最常用的查询的树。如果您有时间阅读,anwser在我最后给出的链接中:)类别和文件有两个单独的集合。但是文件必须知道它们的面包屑,这样当打印搜索结果时(例如20个结果/页),面包屑就可以开箱即用,而不需要20个昂贵的递归。嗯,链接有点tl;博士,如果我必须诚实的话。你有没有想过这里的文档:尤其是具体化的路径。它更新量很大,但更容易查询。您的面包屑有点多余,因为您有一个问题,您已经将类别的名称传输给创建对象子集的所有子级。如果改用路径,您实际上可以满足相当多的查询,即
find({path:/,06060607/})
来判断该id是否在末尾。也许您还可以定义这20个查询?我看到每个包含父atm的子类别都有一个查询。