【问题标题】:Retrieve documents having array containing another document attribute检索具有包含另一个文档属性的数组的文档
【发布时间】:2012-12-28 10:21:04
【问题描述】:

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

类别 JSON 看起来像:

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

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

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


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


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

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

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

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

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

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

【问题讨论】:

  • 没有人知道任何解决方案?
  • 如何做树总是取决于您的查询需求。你需要如何搜索这棵树?这些类别当前是否与 FS 的文件列表分开,以便您拥有一组 categories 和一组 files?不幸的是,在大多数数据库中,树都不是一件容易的事,并且通常在查找或更新时都需要递归,最适合您最常用查询的树。
  • 如果您有时间阅读,答案在我最后给出的链接中:) 类别和文件有 2 个单独的集合。但是文件必须知道它们的面包屑,以便在打印搜索结果时(例如 20 个结果/页),面包屑开箱即用,无需 20 次昂贵的递归
  • 嗯,如果我必须诚实的话,链接有点tl;博士。你有没有想过这里的文档:docs.mongodb.org/manual/tutorial/model-tree-structures 特别是物化路径之一。它更新繁重但更容易查询。您的面包屑有点多余,因为您遇到的问题是您已经将类别的名称传输给创建对象子集的所有子项。如果您改用路径,您实际上可以满足很多查询,即find({path: /,06060607/}) 用于判断该 id 是否在末尾。
  • 也许您也可以定义这 20 个查询?我看到每个包含父 atm 的子类别有一个查询。

标签: mongodb casbah salat


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2017-03-01
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多