传入的参数必须是12个字节的单个字符串或24个十六进制字符的字符串,Mongoose ObjectId错误

ih99xse1  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(146)

事实上,我搜索了一吨,我看到了一吨提到我的问题在这里,但没有一件事,我尝试帮助我解决我的问题。
我有一个房间方案,如下所示:

const ObjectId = mongoose.Schema.ObjectId;
const roomSchema = mongoose.Schema({
users: [{
    type: ObjectId,
    ref: 'User'
}],
messages: [{
    type: ObjectId,
    ref: 'Message',
}],
post: {
    type: ObjectId,
    ref: 'Post'
  }
});

如您所见,我有一个引用了另一个模式Users用户数组
我正在尝试查询其中包含用户ObjectId的所有工作室(在数组中搜索ObjectId)。
虽然我可以很容易地从cmd中查询mongo,使用以下命令:

db.users.find({users:ObjectId('THE_OBJECT_ID')});

当我尝试在使用mongoose时得到相同的结果时,它失败了:

Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters

下面是我的路线和查找方式:

app.route('/rooms/list/:user_id')
    .get((req, res) => {
        var query = { users: "USER_ID" };
        Room.find(query ).populate('messages').then((data) => {
            res.status(200).json(data);
        }).catch((err) => {
            console.log(err);
        });
     })

我尝试创建对象ID类型并使用它,但它仍然不起作用。

var mongoose = require('mongoose'),
userId = 'THE_USER_ID';
var id = mongoose.Types.ObjectId(userId);

且比

Rooms.find({'users': id });

但还是不行。
我也尝试过用$in,$elemmatch改变我的查询搜索,它在cmd上工作,但是当用mongoose查询时失败了。
任何帮助都将不胜感激。

monwx1rj

monwx1rj1#

出版日期:

如果选中此项:

var query = { users: "USER_ID" };

(Or)

userId = 'THE_USER_ID';
var id = mongoose.Types.ObjectId(userId);

您要在这里做什么?您正在传入字符串USER_IDTHE_USER_ID作为输入,并尝试将其转换为ObjectId()类型。但是ObjectId()中的字符串有某些限制,这就是为什么mongoose无法将传入的字符串值转换为ObjectId()并输出错误。
请尝试以下代码:

代码:

const mongoose = require('mongoose');

app.route('/rooms/list/:user_id')
    .get((req, res) => {
        var query = { users: mongoose.Types.ObjectId(req.params.user_id) };
        Room.find(query).populate('messages').then((data) => {
            res.status(200).json(data);
        }).catch((err) => {
            console.log(err);
        });
    })

您的输入应该是user_id的值(将是字符串)-将其转换为ObjectId(),然后查询数据库。因此,user_id的值应该是符合**ObjectId()**限制的字符串,您可以从现有文档的ObjectId()中获取字符串并测试您的get api。

相关问题