Nodejs中对于mongodb自动生成的_id如何查询?

Nodejs中对于mongodb自动生成的_id如何查询?

利用mongo0se取得是null, User.findOne({_id:id},function(err,doc){… 2014-10-25_222556.png

11 回复

Node.js 中对于 MongoDB 自动生成的 _id 如何查询?

在使用 Node.js 和 MongoDB 进行开发时,我们经常需要查询数据库中的文档。MongoDB 自动为每个文档生成一个唯一的 _id 字段,这个字段通常是一个 ObjectId。如果你想要根据这个自动生成的 _id 来查询某个文档,可以使用 Mongoose 或原生 MongoDB 驱动。

示例代码

假设你已经有一个使用 Mongoose 定义的 User 模型,并且想要通过 _id 查询用户信息。以下是一个简单的示例:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义 User 模型
const userSchema = new Schema({
    name: String,
    email: String
});

const User = mongoose.model('User', userSchema);

// 连接 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 查询特定用户的函数
async function findUserById(id) {
    try {
        const user = await User.findById(id);
        if (user) {
            console.log('User found:', user);
        } else {
            console.log('No user found with the specified _id');
        }
    } catch (err) {
        console.error('Error occurred while querying user:', err);
    }
}

// 调用查询函数
findUserById('653b8f9e2c1d4e5a2b7c8f90'); // 替换为你想要查询的 _id

解释

  1. 连接 MongoDB:

    • 使用 mongoose.connect() 方法连接到 MongoDB 数据库。
    • useNewUrlParseruseUnifiedTopology 是为了确保与 MongoDB 的连接更加安全和高效。
  2. 定义模型:

    • 使用 mongoose.Schema 定义 User 模型。
    • User 模型包含了两个字段:nameemail
  3. 查询函数:

    • findUserById 函数接收一个 _id 参数。
    • 使用 User.findById(id) 方法查询具有指定 _id 的用户。
    • 如果找到用户,则打印用户信息;否则,打印提示信息。
    • 捕获并处理可能发生的错误。

通过这种方式,你可以轻松地查询 MongoDB 中自动生成的 _id 对应的文档。


var ObjectID = require(‘mongodb’).ObjectID; User.findOne({_id:ObjectID(id)},function(err,doc){…

我没有用mongoose,我用的是原生的mongodb api,id需要用ObjectID封装一下,mongoose应该有api直接传字符串的id

你确定查询的时候id不是空的吗,或者数据库中就没有这条记录

mongoose 中 schema 定义的mongoose.Schema.Type 是 ObjectID吗

是不是数据表名不一样导致无数据?什么条件都不传能查到吗

> db.Users.find({"_id":ObjectId("54fd4c7102886ede83e02d28")})
{ "_id" : ObjectId("54fd4c7102886ede83e02d28"), "name" : "foo" }

今天也遇到同样的问题,MongoDB更新的时候,用自己定义一个deviceid作为主键来操作,发现不对,看来不能有两个主键。另外想吐超,Mongo里面的id好长啊,如何自定义为类型

Node.js 中对于 MongoDB 自动生成的 _id 如何查询?

在 Node.js 中使用 Mongoose 查询 MongoDB 自动为文档生成的 _id 是一个常见的需求。通常情况下,_id 是一个 ObjectId 类型的字段。如果你直接通过字符串形式的 _id 进行查询,可能会遇到问题。

以下是一个示例代码,展示了如何正确地查询 _id

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义一个简单的用户模型
const userSchema = new Schema({
    name: String,
    email: String
});

const User = mongoose.model('User', userSchema);

// 连接到 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 示例 ID
const id = '653c8c98d6f1b9e0a70f924c';

// 使用 Mongoose 查询用户
User.findOne({ _id: mongoose.Types.ObjectId(id) }, (err, doc) => {
    if (err) {
        console.error('查询失败:', err);
        return;
    }
    if (!doc) {
        console.log('没有找到匹配的用户');
    } else {
        console.log('找到的用户:', doc);
    }
});

解释

  1. 导入 Mongoose:首先需要导入 Mongoose 库。
  2. 定义 Schema 和 Model:定义一个简单的用户模式,并创建一个对应的 Mongoose 模型。
  3. 连接到 MongoDB:使用 mongoose.connect() 方法连接到 MongoDB 数据库。
  4. 查询用户:使用 findOne() 方法查询指定的 _id。注意,传入的 _id 需要使用 mongoose.Types.ObjectId() 进行转换,以确保其类型与数据库中的 _id 类型一致。

如果直接使用字符串形式的 _id(例如 '653c8c98d6f1b9e0a70f924c'),Mongoose 无法正确识别其类型,因此查询可能返回 null。将字符串形式的 _id 转换为 ObjectId 类型可以解决这个问题。

回到顶部