关于DBRef类型的mongodb查询

时间:2015-07-31 18:45:44

标签: mongodb mongodb-query mongo-shell dbref

如何在mongodb shell中的有效mongodb查询中启用此查询。

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

cars.owner此处为DBRef,但$ref无效

我收到此错误:

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

我的目标是弄清楚是否有任何汽车"拥有"通过不同的集合然后用户。

3 个答案:

答案 0 :(得分:0)

MongoDB文档(database-reference)说:

  

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

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

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

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

答案 1 :(得分:-1)

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

  

DBRef文档类似于以下文档:

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

当cars.owner是对用户集合中的文档的引用时,查找所有所有者是某个_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 :(得分:-1)

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

放入集合。然后创建一个具有feild name作为parameterName的Bean,并将morphia orm的@Reference注释放入,然后执行您想要的操作