Nodejs mongous,是我不够懂你吗?关于mongous不支持objectId查询

Nodejs mongous,是我不够懂你吗?关于mongous不支持objectId查询

mongous 好像不支持 用 _id 查询,_id 是objectId 类型的,mongous虽然内置了bson,但是并没有提供 bson/objectid 的调用接口。 好吧我用 mongodb 中提供的接口调用到了 objectid,并且用 new ObjectId(id) 生成了可以供查询的对象,但是仍然报错, attempt to write beyond buffer bounds

看了下 mongous 的issues https://github.com/amark/mongous/issues/12 好像作者也无意支持。

请问各位大神,是我不会用,还是真的是不支持? 求解~~


5 回复

Node.js mongous,是我不够懂你吗?关于mongous不支持objectId查询

在使用 mongous 这个库时,我发现它好像不支持通过 _id(一个ObjectId类型)进行查询。尽管 mongous 内置了 bson 库,但似乎并没有提供直接操作 bson/objectid 的接口。

示例代码

假设我们有一个集合 users,其中每个文档都有一个 ObjectId 类型的 _id 字段:

const mongous = require('mongous');
const { ObjectId } = require('mongodb'); // 使用 MongoDB 提供的 ObjectId

// 连接到 MongoDB
mongous.connect('mongodb://localhost:27017/test', (err) => {
    if (err) throw err;
    
    // 获取集合
    const users = mongous.collection('users');
    
    // 尝试通过 ObjectId 查询
    const idToFind = '5f8d9e7b2c3d4e5f6a7b8c9d';
    const objectId = new ObjectId(idToFind); // 创建 ObjectId 对象
    
    users.findOne({ _id: objectId }, (err, doc) => {
        if (err) {
            console.error(err);
            return;
        }
        
        if (doc) {
            console.log('Found document:', doc);
        } else {
            console.log('No document found.');
        }
    });
});

遇到的问题

当我尝试使用 new ObjectId(id) 生成可以供查询的对象时,仍然遇到了错误:

attempt to write beyond buffer bounds

调查结果

经过调查发现,mongous 的作者似乎并没有打算支持这种查询方式。查看了 mongous 的 GitHub 仓库中的 Issues 页面,确实有相关的讨论(链接),作者明确表示没有计划添加对 ObjectId 查询的支持。

解决方案

如果 mongous 确实不支持 ObjectId 查询,那么你可以考虑以下几种解决方案:

  1. 切换到原生 MongoDB 驱动:使用官方的 MongoDB Node.js 驱动,它可以更好地支持 ObjectId 查询。

    const { MongoClient } = require('mongodb');
    
    async function run() {
        const client = new MongoClient('mongodb://localhost:27017/test');
        
        await client.connect();
        const db = client.db();
        const users = db.collection('users');
        
        const idToFind = '5f8d9e7b2c3d4e5f6a7b8c9d';
        const objectId = new ObjectId(idToFind);
        
        const doc = await users.findOne({ _id: objectId });
        console.log(doc ? 'Found document:' : 'No document found.', doc);
        
        await client.close();
    }
    
    run().catch(console.error);
    
  2. 自定义查询方法:如果你仍然想继续使用 mongous,可以手动处理 _id 字符串,将其转换为 ObjectId,然后进行查询。

希望这些信息对你有所帮助!


为啥用这个 mongoose moogndb 还有很多很多 都非常好

我也遇到了這個問題,現已解決,貼出來分享一下。

不要使用node-mongodb-native的ObjectID來生成ObjectId,用Mongous的ObjectID接口。

var ObjectID = require('../lib/mongous/bson/objectid').ObjectID;

mongoose 难道不是很好的选择吗

从你的描述来看,mongous 库可能确实存在一些局限性,特别是对于 MongoDB 的 ObjectId 类型的支持。不过,你可以使用原生的 MongoDB Node.js 驱动来解决这个问题。

以下是一个使用原生 MongoDB 驱动进行 ObjectId 查询的示例:

const { MongoClient } = require('mongodb');

async function main() {
    const uri = "your_mongodb_connection_string";
    const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

    try {
        await client.connect();
        const database = client.db("your_database_name");
        const collection = database.collection("your_collection_name");

        // 创建一个 ObjectId 对象
        const idToQuery = "5f9c9d1e7c43a83b1c3d4e5f";
        const oid = collection.s.client.s.topology.bsonType.ObjectID.createFromHexString(idToQuery);

        // 使用 ObjectId 进行查询
        const result = await collection.findOne({ _id: oid });
        console.log(result);
    } finally {
        await client.close();
    }
}

main().catch(console.error);

解释

  1. 连接到 MongoDB:首先使用 MongoClient 连接到你的 MongoDB 实例。
  2. 获取集合:通过数据库对象获取你需要操作的集合。
  3. 创建 ObjectId:使用原生驱动的 createFromHexString 方法将字符串形式的 ObjectId 转换为真正的 ObjectId 对象。
  4. 执行查询:使用转换后的 ObjectId 对象进行查询。

如果你仍然遇到问题,建议检查是否正确导入了 MongoDB 驱动,并确保连接字符串和数据库、集合名称正确无误。

回到顶部