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

时间:2012-12-28 10:21:05

标签: mongodb casbah salat

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

JSON类似:

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

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

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


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


我想知道的是,是否可以执行查询以检索具有错误面包屑的类别。我需要一个允许执行的查询:

  

检索所有没有的类别:last数组元素   breadcrumb.id = parentId

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

  

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

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

这个问题可以帮助您了解我面临的问题:Which DB would you use? MongoDB/Neo4j/SQL... all of them?

1 个答案:

答案 0 :(得分:3)

您可以使用$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' 
})