3

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

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

cars.owner这里是 DBRef,但$ref无效

我收到此错误:

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

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

4

3 回答 3

1

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

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" } })
于 2015-08-03T18:15:52.173 回答
0

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
于 2016-02-22T14:40:36.933 回答
0
<parameterName>: DBRef("CollectionName", "_id Value")

放入集合。然后创建一个具有字段名称作为参数名称的Bean,并将吗啡orm的@Reference注释然后做你想要的操作

于 2016-08-11T07:08:40.040 回答