【问题标题】:mongodb query on DBRef typeDBRef 类型的 mongodb 查询
【发布时间】:2015-07-31 18:45:44
【问题描述】:

如何在 mongodb shell 中将此查询转换为有效的 mongodb 查询。

{ 'cars.owner.$ref' : 'users' } 

cars.owner 在这里是一个 DBRef,但是$ref 是无效的

我收到此错误:

"$err" : "Positional operator does not match the query specifier."

我的目标是弄清楚是否有任何汽车被不同的收藏品“拥有”然后是用户。

【问题讨论】:

  • 当您只允许引用一个集合时,通常最好只存储 _id 而不是 DBRef。
  • @Philipp 我只是在探索数据。只存储 _id 而不是 DBRef 的动机是什么?
  • DBRef 基本上被认为已被弃用,我对未来持续的驱动程序支持不抱太大希望。这是一个早期的想法,并不是一个很好的构思。该格式还存储与现在为保留字符建立的命名约定冲突的字段名称。现在的一般约定是简单地存储文档的_id 和可选的集合和/或数据库命名空间,或者通过描述关系的外部模式逻辑和_id。坚持使用 DBRef 是一条充满恐惧的黑暗之路。尽可能下车。
  • @BlakesSeven 在文档中我可以在哪里找到 DBRef 已被弃用?
  • @WillemD'haeseleer DBRef 是一个对象,它包括_id、集合和可选的数据库。在大多数情况下,您已经知道将在其中找到引用的集合和数据库,因此它们是无用的膨胀。

标签: mongodb mongodb-query mongo-shell dbref


【解决方案1】:

您可以在 Mongo shell 中查询 DBRef,但您必须使用 DBRef() 函数。引用必须至少包含 $ref 和 $id。来自docs

DBRef 文档类似于以下文档:

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }

当 cars.owner 是对 users 集合中文档的引用时,查找所有者为特定 _id 的所有汽车的查询可能如下所示(假设两个集合在同一个数据库中):

db.cars.find({ "owner" : DBRef("users", ObjectId("<user _id value>")) })

$ref 和 $id 值不能直接查询。 DBRef 在同一文档中有多个对不同集合的引用的情况下最有用。正如其他人所提到的,当文档中只有一个引用时,使用 DBRef 可能会过大。

如果您需要在您的所有者字段中引用不同的集合,使用单独的 owner_collection 和 owner_id 字段可能会更好。查找所有非用户所有者的查询将成为标准查询:

db.cars.find({ owner_collection: { $ne: "users" } })

【讨论】:

    【解决方案2】:

    MongoDB 文档 (database-reference) 说明如下:

    MongoDB 应用程序使用以下两种方法之一来关联文档:

    • 手动参考,您将一个文档的 _id 字段保存在另一个文档中作为参考。然后您的应用程序可以运行第二个查询以返回相关数据。对于大多数用例来说,这些参考资料既简单又足够。
    • DBRefs 是从一个文档到另一个文档的引用,使用第一个文档的 _id 字段的值、集合名称以及可选的数据库名称。通过包含这些名称,DBRefs 允许位于多个集合中的文档更容易地与来自单个集合的文档链接。要解析 DBRefs,您的应用程序必须执行额外的查询以返回引用的文档。许多驱动程序具有自动形成 DBRef 查询的辅助方法。驱动程序1 不会自动将 DBRefs 解析为文档。

    我不知道任何计划,但我读到 DBRefs 现在应该被弃用(?)。但是,您可以使用 fetch() - 方法来加载引用的文档。例如,我有 formView 集合,它存储包含对 formContent 集合中文档的 (DBRef) 引用的文档。所以,运行:

    var view = db.formView.findOne()
    view.formContent
    view.formContent.fetch()
    view.formContent.fetch().code
    

    ...将产生以下输出:

    DBRef("formContent", ObjectId("56cb155ea826872b67373e76"))
    {
        "_id" : ObjectId("56cb155ea826872b67373e76"),
        "code" : "test_content",
        "version" : 0
    }
    test_content
    
    【解决方案3】:
    <parameterName>: DBRef("CollectionName", "_id Value")
    

    放入collection。然后创建一个bean,字段名称为parameterName,并将morphia orm的@Reference注解,然后做你想要的操作

    【讨论】:

    • 添加一些描述
    • 这个答案没有意义
    猜你喜欢
    • 2012-11-01
    • 2017-05-21
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2012-02-01
    相关资源
    最近更新 更多