如何在 mongodb shell 中将此查询转换为有效的 mongodb 查询。
{ 'cars.owner.$ref' : 'users' }
cars.owner
这里是 DBRef,但$ref
无效
我收到此错误:
"$err" : "Positional operator does not match the query specifier."
我的目标是弄清楚是否有任何汽车由不同的收藏品“拥有”然后是用户。
如何在 mongodb shell 中将此查询转换为有效的 mongodb 查询。
{ 'cars.owner.$ref' : 'users' }
cars.owner
这里是 DBRef,但$ref
无效
我收到此错误:
"$err" : "Positional operator does not match the query specifier."
我的目标是弄清楚是否有任何汽车由不同的收藏品“拥有”然后是用户。
您可以在 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" } })
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
<parameterName>: DBRef("CollectionName", "_id Value")
放入集合。然后创建一个具有字段名称作为参数名称的Bean,并将吗啡orm的@Reference注释然后做你想要的操作