【问题标题】:Argument passed in must be a single String of 12 bytes or a string of 24 hex characters, Mongoose ObjectId err传入的参数必须是12字节的单个String或24个十六进制字符的字符串,Mongoose ObjectId err
【发布时间】:2020-09-06 05:14:39
【问题描述】:

我实际上搜索了很多,我在这里看到很多关于我的问题的提及,但我尝试过的所有方法都没有帮助我解决我遇到的问题。

我有一个如下所示的房间方案:

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

如您所见,我有一个用户数组,其中引用了另一个架构用户

我正在尝试查询其中包含用户 ObjectId 的所有房间(在数组中搜索 ObjectId)。

虽然我可以使用以下命令从 cmd 查询 mongo 轻松获得此信息:

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

当我尝试在使用猫鼬时获得相同的结果时,它会失败:

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 查询时失败。

任何帮助将不胜感激。

【问题讨论】:

  • 你输入的应该是user_id,转换成ObjectId()再查询。所以user_id 的值应该是一个遵守ObjectId() 限制的字符串,您可以从现有文档的ObjectId() 中获取字符串并测试您的get api..

标签: mongodb mongoose mongodb-query


【解决方案1】:

问题:

如果你检查这个:

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。

【讨论】:

  • 服务器失败:var query = { users: mongoose.Types.ObjectId(req.params.user_id) };错误:没有指定默认引擎,也没有提供扩展。
  • @Yonihodefi :尝试使用日志进行调试,此错误不应该来自代码的那部分。检查:stackoverflow.com/questions/23595282/…
  • 我能够修复错误,尽管查询仍然返回空结果,这很奇怪,因为直接查询 mongo 会产生东西
  • @Yonihodefi :由于您能够修复此错误,因此此问题已解决,您可以关闭它。要测试您为什么会收到此错误 - 打印 req.params.user_id 并检查您是否获得至少一个文档 _id 字段中存在的值,还要检查字符串到 ObjectId() 的转换是否正常工作..
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多