MongoDb - 要创建一个新的ObjectId,请尝试`Mongoose.Types.ObjectId`而不是使用`Mongoose.Schema.ObjectId`
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDb - 要创建一个新的ObjectId,请尝试`Mongoose.Types.ObjectId`而不是使用`Mongoose.Schema.ObjectId`相关的知识,希望对你有一定的参考价值。
我是Node.js和mongodb的新手。
在我的Node.js应用程序中,我正在使用mongodb和mongodb操作我正在使用mongoose。
在package.json
文件中,我有以下依赖项:
"mongoose": "4.11.9"
虽然我的应用程序工作(我可以做我想要的一切),在服务器日志中我总是看到以下错误消息:
要创建一个新的ObjectId,请尝试使用
Mongoose.Types.ObjectId
而不是使用Mongoose.Schema.ObjectId
。
我怎么解决这个问题 ?
它已针对mongoose 4.11.10
及更高版本修复,因此请尝试升级您的版本以消除警告。
这是#5571无意的副作用因为employees.certifications
恰好是24个字符长。
var mongoose = require('mongoose');
var zoneSchema = new mongoose.Schema({
employees: {
certifications: {type: mongoose.Schema.Types.ObjectId, ref: 'Certifications'}
}
});
var certificationsSchema = new mongoose.Schema({
type: String,
list: [{type: mongoose.Schema.Types.ObjectId, ref: 'Certification'}]
});
var certificationSchema = new mongoose.Schema({
name: String
});
var Zone = mongoose.model('Zone', zoneSchema);
var Certifications = mongoose.model('Certifications', certificationsSchema);
var Certification = mongoose.model('Certification', certificationSchema);
var newZone = new Zone();
如需进一步阅读,请查看issue#5587和issue#5571
您所看到的是一条警告消息(与导致您的节点进程退出的错误相反)。
考虑这个例子:
#!/usr/bin/env node
'use strict';
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const conn = mongoose.connection;
const Schema = mongoose.Schema;
const schema = new Schema({
myRef: {
type: Schema.Types.ObjectId,
ref: 'someothercollection'
}
});
const Test = mongoose.model('test', schema);
const test = new Test({
myRef: Schema.ObjectId() // or Schema.Types.ObjectId()
});
const test2 = new Test({
myRef: mongoose.Types.ObjectId()
});
async function run() {
await conn.dropDatabase();
let doc = await test.save();
console.log(doc);
let doc2 = await test2.save();
console.log(doc2);
return conn.close();
}
run();
输出:
stack: ./49841247.js
mongoose: To create a new ObjectId please try `Mongoose.Types.ObjectId` instead of using `Mongoose.Schema.ObjectId`. Set the `suppressWarning` option if you're trying to create a hex char path in your schema.
Trace
at Function.ObjectId (/Users/lineus/dev/Help/mongoose5/node_modules/mongoose/lib/schema/objectid.js:30:13)
at Object.<anonymous> (/Users/lineus/dev/Help/mongoose5/stack/49841247.js:19:17)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3
{ _id: 5ad33e173a19606ffa47c95c, __v: 0 }
{ _id: 5ad33e173a19606ffa47c95e,
myRef: 5ad33e173a19606ffa47c95d,
__v: 0 }
stack:
你可以看到:
- 第一个文档的myRef属性根本没有设置,它会打印警告消息。
- 在第二个文档中,myRef属性设置正确。
如果您收到此警告,那么很可能在代码中的某个位置使用错误的方法生成objectId。
如果您没有错误地手动生成objectId,请查看the next answer at the time of this edit.
以上是关于MongoDb - 要创建一个新的ObjectId,请尝试`Mongoose.Types.ObjectId`而不是使用`Mongoose.Schema.ObjectId`的主要内容,如果未能解决你的问题,请参考以下文章
如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?
如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?