Nodejs + mongodb:如何查询$ ref字段?

Fre*_*iot 9 javascript mongodb node.js dbref

我使用带有nodejs REST服务的MongoDB,它暴露了我存储在里面的数据.我有一个关于如何查询使用$ ref的数据的问题.

以下是Object的示例,其中包含对其他对象(详细信息)的引用:

{
    "_id" : ObjectId("5962c7b53b6a02100a000085"),
    "Title" : "test",
    "detail" : {
        "$ref" : "ObjDetail",
        "$id" : ObjectId("5270c7b11f6a02100a000001")
    },
    "foo" : bar
}
Run Code Online (Sandbox Code Playgroud)

实际上,使用Node.js和mongodb模块,我执行以下操作:

db.collection("Obj").findOne({"_id" : new ObjectID("5962c7b53b6a02100a000085"},
function(err, item) {
    db.collection(item.$ref).findOne({"_id" : item.$id}, function(err,subItem){
        ...
    });
});
Run Code Online (Sandbox Code Playgroud)

实际上我做了2个查询,得到了2个对象.这是一种"懒惰的装载"(不完全是,几乎)

我的问题很简单:是否可以在一个查询中检索整个对象图?

谢谢

Leo*_*tny 6

是否可以使用单个MongoDB查询获取父对象及其$ ref?

不,这是不可能的. Mongo没有内部支持refs,所以由你的应用程序来填充它们(参见Brett的回答).

但是有可能使用单个node.js命令获取其所有ref的父对象吗?

是的,这是可能的.你可以用Mongoose做到这一点.它具有内置ref的人口支持.您需要稍微更改一下数据模型才能使其正常工作,但这几乎就是您所需要的.当然,要做到这一点,Mongoose会做同样的两个MongoDB查询.


Bre*_*ett 5

不,你不能.

要解析DBRefs,您的应用程序必须执行其他查询以返回引用的文档.许多驱动程序都有辅助方法,可以自动形成DBRef的查询.驱动程序不会自动将DBRef解析为文档.

来自MongoDB文档http://docs.mongodb.org/manual/reference/database-references/.


小智 2

Vladimir 的回答仍然无效,因为 db.dereference 方法已从 MongoDB Nodejs API 中删除:

https://www.mongodb.com/blog/post/introducing-nodejs-mongodb-20-driver

数据库实例对象已被简化。我们删除了以下方法:

由于服务器中不推荐使用数据库引用而导致 db.dereference