MongoDB中针对DBRef类型的查询

3
我应该如何在MongoDB shell中将此查询转换为有效的MongoDB查询?
{ 'cars.owner.$ref' : 'users' } 

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

我收到了这个错误信息:

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

我的目标是找出是否有任何汽车被不同的收藏机构拥有而非用户。


当您只允许引用一个集合时,最好仅存储 _id 而不是 DBRef。 - Philipp
@Philipp 我只是在探索数据。为什么只存储 _id 而不是 DBRef 的动机是什么? - Willem D'Haeseleer
DBRef基本上被认为已经过时了,未来的驱动程序支持也不会有太大希望。这是一个早期的想法,而且并不是一个非常好的想法。该格式存储了与现在保留字符的命名约定冲突的字段名称。现在的一般约定是仅存储文档的_id,并可选择自己存储集合和/或数据库命名空间,或通过描述关系和仅存储_id的外部模式逻辑来存储。坚持使用DBRef是一条充满恐惧的黑暗之路。趁你还能离开吧。 - Blakes Seven
1
@BlakesSeven 在文档中我可以找到DBRef已被弃用的信息吗? - Willem D'Haeseleer
@WillemD'haeseleer DBRef是一个对象,其中包括_id、集合和可选的数据库。在大多数情况下,您已经知道引用将被找到的集合和数据库,因此它们是无用的膨胀。 - Philipp
3个回答

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

DBRef documents resemble the following document:

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }
当cars.owner是指向users集合中文档的引用时,查找所有owner为特定_id的cars的查询可能如下(假设两个集合在同一个数据库中):
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" } })

0

MongoDB文档(数据库参考)如下所述:

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

请查看以下链接:https://dev59.com/52rXa4cB1Zd3GeqPC8sO#13361828 和 https://dev59.com/LYzda4cB1Zd3GeqPrM6n#31305933。 - niko.makela

0
<parameterName>: DBRef("CollectionName", "_id Value")

将数据放入集合中。然后创建一个Bean,其字段名称为parameterName,并在morphia orm的@Reference注释中放置,然后进行所需的操作。


add some description to it - piyushj
2
这个答案毫无意义。 - Willem D'Haeseleer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接