Nodejs 关于mongoskin的DBRef找不到fetch方法

Nodejs 关于mongoskin的DBRef找不到fetch方法

提示object <#DBRef> has no method ‘fetch’,而shell里是可以用fetch方法的。

3 回复

Node.js 关于 mongoskin 的 DBRef 找不到 fetch 方法

在使用 Node.js 和 mongoskin 进行 MongoDB 操作时,你可能会遇到一个问题:当你尝试从 DBRef 对象中调用 fetch 方法时,会得到一个错误信息,提示该对象没有 fetch 方法。这是因为 mongoskin 并不直接支持 fetch 方法。然而,在 MongoDB shell 中,你可以直接使用 fetch 方法来获取引用的对象。

示例代码

假设你有一个集合 users,其中包含对另一个集合 posts 的引用。我们来看看如何处理这种情况:

var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/test", {native_parser:true});

// 假设我们有一个 DBRef 对象
var dbRef = {
    $ref: 'posts',
    $id: '5f4e3a8c9b1c5d6e7f8a9b0c'
};

// 尝试直接使用 fetch 方法(这将失败)
try {
    dbRef.fetch(db, function(err, post) {
        if (err) throw err;
        console.log(post);
    });
} catch (e) {
    console.error(e.message); // 输出 "TypeError: object <#DBRef> has no method 'fetch'"
}

解决方案

为了解决这个问题,你需要手动实现 fetch 方法。以下是一个简单的实现:

function fetchDBRef(dbRef, db, callback) {
    db.collection(dbRef.$ref).findOne({_id: dbRef.$id}, function(err, doc) {
        if (err) return callback(err);
        callback(null, doc);
    });
}

// 使用自定义的 fetch 方法
fetchDBRef(dbRef, db, function(err, post) {
    if (err) throw err;
    console.log(post);
});

在这个解决方案中,我们定义了一个 fetchDBRef 函数,它接受 dbRef、数据库连接对象 db 和一个回调函数作为参数。这个函数通过查询 dbRef 引用的集合来获取文档,并将其传递给回调函数。

总结

虽然 mongoskin 不直接支持 fetch 方法,但你可以通过编写自己的方法来实现相同的功能。这不仅解决了问题,还使你的代码更加灵活和可维护。希望这个解决方案对你有所帮助!


自己定义一个:

 db = mongo.db config.main_mongo.url, config.main_mongo.option

mongo.DBRef.prototype.fetch = (callback)-> db.collection(this.namespace).findById(this.oid, callback)

一样用,不过是异步的。

当你在使用 mongoskin 库时遇到 DBRef 对象没有 fetch 方法的问题,是因为 mongoskin 并没有直接提供 fetch 方法。DBRef 是 MongoDB 中的一个引用类型,用于引用数据库中的其他文档。fetch 方法通常是在一些扩展库或自定义函数中实现的。

你可以通过以下方式来解决这个问题:

  1. 手动解析 DBRef:如果你只是需要解析 DBRef,可以自己写一个简单的函数来解析它。
  2. 使用第三方库:可以考虑使用第三方库,如 mongojsmongoose,它们提供了更完整的功能集。

示例代码

假设你有一个 DBRef 对象,你需要解析它以获取实际的文档数据。你可以编写一个函数来完成这个操作:

const mongo = require('mongoskin');
const db = mongo.db("mongodb://localhost:27017/mydb", { native_parser: true });

function fetchDocument(dbRef, callback) {
    const collectionName = dbRef.$ref;
    const documentId = dbRef.$id;
    
    db.collection(collectionName).findOne({ _id: documentId }, (err, doc) => {
        if (err) return callback(err);
        callback(null, doc);
    });
}

// 假设你有一个 DBRef 对象
const dbRef = {
    "$ref": "users",
    "$id": "5f6c9d3b3e0f4a5c7d8e9fa0"
};

fetchDocument(dbRef, (err, doc) => {
    if (err) throw err;
    console.log(doc); // 输出实际的文档数据
});

解释

  • fetchDocument 函数接受一个 DBRef 对象和一个回调函数。
  • 该函数从 DBRef 中提取集合名称和文档 ID。
  • 然后查询相应的集合,找到对应的文档,并返回给回调函数。

这种方式虽然不如直接使用 fetch 方法方便,但在 mongoskin 中是最常见的处理方法。如果你觉得这种方法不够优雅,可以考虑切换到 mongoose 或其他更高级的库。

回到顶部