当前位置: 首页 > 面试题库 >

猫鼬:强制转换为ObjectId的值

宇文俊风
2023-03-14
问题内容

我试图在猫鼬中指定我的数据库的架构。目前,我这样做:

var Schema = mongoose.Schema;  
var today = new Date(2011, 11, 12, 0, 0, 0, 0);


var personSchema = new Schema({  
   _id : Number,
   name: { type: String, required: true },  
   tel: { type: String, required: true },  
   email: { type: String, required: true },
   newsitems: [{ type: Schema.Types.ObjectId, ref:'NewsItem'}]
});

var taskSchema = new Schema({ 
    _id: Number,
    description: { type: String, required: true },  
    startDate: { type: Date, required: true },
    newsitems: [{ type: Schema.Types.ObjectId, ref:'NewsItem'}]
});

var newsSchema = new Schema({
    _id: Number,
    creator : { type: Schema.Types.ObjectId, ref: 'Person' },
    task : { type: Schema.Types.ObjectId, ref: 'Task' },
    date: { type: Date, required:true },
    loc: {type: String, required: true }  
});

var NewsItem  = mongoose.model('NewsItem', newsSchema);
var Person = mongoose.model('Person', personSchema);
var Task = mongoose.model('Task', taskSchema);



var tony = new Person({_id:0, name: "Tony Stark", tel:"234234234", email:"tony@starkindustries.com" });
var firstTask = new Task({_id:0, description:"Get an interview with the president", startDate:today});
var newsItem1 = new NewsItem({_id:0, creator: tony.id, task: firstTask.id, date: today, loc: "NY"});

newsItem1.save(function (err) {
  if (err) console.log(err);

    firstTask.save(function (err) {
        if (err) console.log(err);
    });

    tony.save(function (err) {
         if (err) console.log(err);
    }); 
});



NewsItem
.findOne({ loc: "NY" })
.populate('creator')
.populate('task')
.exec(function (err, newsitem) {
  if (err) console.log(err)
    console.log('The creator is %s', newsitem.creator.name);
})

我创建模式并尝试保存一些数据。

错误:

{ message: 'Cast to ObjectId failed for value "0" at path "creator"',
  name: 'CastError',
  type: 'ObjectId',
  value: '0',
  path: 'creator' }

我根据以下代码编写了此代码:http :
//mongoosejs.com/docs/populate.html#gsc.tab=0

我怎样才能解决这个问题?


问题答案:

您引用的猫鼬文档中的示例Number用于该personSchema._id字段以及ObjectId其他字段。

我假设他们在示例中这样做是为了证明可以使用其中任何一个。如果未_id在架构中指定,ObjectId将为默认值。

在这里,您的所有记录都有一个_id字段,它是ObjectId,但是您将它们视为数字。此外,除非您省略了定义它们的部分,否则诸如personIDtaskID不存在字段。

如果确实要对所有_id字段都使用数字,则必须在模式中进行定义。

var newsSchema = new Schema({
  _id: Number,
  _creator: {type: ObjectId, ref: "Person"},
  // ...
})

var personSchema = new Schema({
  _id: Number,
  // ...
})

然后创建具有特定ID的新闻项,并将其分配给创建者:

var tony = new Person({_id: 0});
var newsItem = new NewsItem({_id: 0, creator: tony.id});

然而,需要注意的一点是这里,当你使用其他的东西比ObjectId_id领域,你承担自己管理这些价值的责任。ObjectId是自动生成的,不需要额外的管理。

编辑:我还注意到您在关联的两侧都存储了引用。这是完全有效的,您有时可能想要这样做,但是请注意,您必须自己将引用存储在pre钩子中。



 类似资料:
  • 我试图在用户模型上找到一个基于字符串的令牌。我收到错误: 文档的存储方式如下: 我这样查询文档: 这是我当前的模式: 我猜mongoose正试图将这个十六进制字符串转换成一个_id值?是否有某种方法可以防止mongoose将字符串强制转换为?

  • 问题内容: 我以这种方式将猫鼬文档作为json返回: 但是,还返回了user . proto。没有它我怎么能回来?我尝试了这个但没有用: 问题答案: 您也可以尝试mongoosejs的lean():

  • 问题内容: 我想用Mongoose 生成一个MongoDB 。有没有办法从Mongoose 访问构造函数? 这个问题是关于从头开始 产生新的 。生成的ID是全新的通用唯一ID。 另一个问题是关于从 现有的字符串表示形式 创建一个。在这种情况下,您已经具有ID的字符串表示形式(它可能是通用的也可能不是唯一的),并且正在将其解析为。 问题答案: 您可以在找到构造函数。这是一个例子: 是一个新生成的。

  • 给定如下所示的数据帧 您可能会注意到,这里所有的列都已转换为类型。是否有办法将某些列转换为? 尝试了以下方法 这会引发错误 阅读有关可为空的整数数据类型的信息,然后重试 这会引发错误

  • 问题内容: 我正在使用mongoose使用Node.js,Express和MongoDB构建CRUD风格的REST服务。此服务将允许已经存在的android应用程序的用户在线上载/同步其单个数据库的内容。 已经存在的应用程序的数据模型使用UUID(用Java生成),该UUID与较短的单调MongoDB样式字段冲突。由于数据模型已经存在,并且填充了许多用户的数据,因此无法将源数据转换为单调的Mong

  • 我对Android系统比较陌生 转换为ObjectId失败,因为路径为“login”,模型为“User”,名称为“CastError”,“stringValue”,“login”,“kind”,“ObjectId”,“value”,“login”,“path”:“\u id”} 我已经在邮递员上测试了我的Rest API,一切都恢复得很好。Restful API是用Node.js和Express编