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 好像作者也无意支持。
请问各位大神,是我不会用,还是真的是不支持? 求解~~
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
查询,那么你可以考虑以下几种解决方案:
-
切换到原生 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);
-
自定义查询方法:如果你仍然想继续使用
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);
解释
- 连接到 MongoDB:首先使用
MongoClient
连接到你的 MongoDB 实例。 - 获取集合:通过数据库对象获取你需要操作的集合。
- 创建 ObjectId:使用原生驱动的
createFromHexString
方法将字符串形式的ObjectId
转换为真正的ObjectId
对象。 - 执行查询:使用转换后的
ObjectId
对象进行查询。
如果你仍然遇到问题,建议检查是否正确导入了 MongoDB 驱动,并确保连接字符串和数据库、集合名称正确无误。