我通过 pre hook 为 mongodb 文档保存一个较小的唯一 id。
schema.pre('save', function(next) {
this.refId = uid();
next();
});
Run Code Online (Sandbox Code Playgroud)
据我了解,save挂钩仅在创建文档时运行。
但是,当我通过查询获取文档并尝试通过添加一些新数据来保存它时,唯一的 id ( refId) 字段也会更新。
const foo = Foo.findOne({refId: 'fwe23fw23'});
Foo.field = 'new value';
Foo.save(); // runs pre hook again;
Run Code Online (Sandbox Code Playgroud)
这让我相信save钩子在每个save()查询上运行,无论它是否是createorupdate方法。
如何确保refId只创建一次并且在任何更新操作中都不会更改?
注意:我知道我可以使用updateOne()模型本身来更新文档。但我想了解为什么保存文档本身不起作用。
我有一个带有一个虚拟字段的模型show:
modelSchema.virtual('show').get(function () {
return true
})
Run Code Online (Sandbox Code Playgroud)
现在,当我在 NodeJS 中使用查询时,find如下所示:
model.find({"$license_id": license_id})
Run Code Online (Sandbox Code Playgroud)
结果,我有了虚拟场show。
但
如果我使用aggregation 这样的查询:
model.aggregate([
{
$match: {
$expr: { $eq: ["$license_id", license_id] }
}
}
])
Run Code Online (Sandbox Code Playgroud)
结果我没有虚拟场show。
如何获取aggregation查询中的虚拟字段?您有解决这个问题的想法吗?
猫鼬
Imagdata.dropIndexes( { "image_id": 1 }, function(err){
if(err){
res.send("error");
}
else{
res.send("success");
}
});
Run Code Online (Sandbox Code Playgroud)
这是我用来删除字段'image_id'的索引的代码.当我尝试执行此函数时,它显示"TypeError:Imagdata.dropIndexes不是函数".如何解决这个问题......
例如,我们可以考虑以下模型:
Companies {Name: string, Address:string}
Employees {FirstName: string,
lastName:String,
Company: {type:mongoose.schema.objectID,ref:companies}
}
Run Code Online (Sandbox Code Playgroud)
需要限制删除在数据库级别拥有员工记录的公司,而不使用“预”中间件。
我正在寻找一些类似于 MySQL 关系约束的解决方案 - 删除限制。
文件结构:
? resolvers.js
? schema.js
?
????schemas
matchesSchema.js
playersSchema.js
teamsSchema.js
tournamentsSchema.js
Run Code Online (Sandbox Code Playgroud)
所以我有 4 个模式,我想在我所有的模式中使用其他模式,但是当我导入它时,我收到一个错误:
C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\mongoose\lib\schema.js:425
throw new TypeError('Invalid value for schema Array path `' + prefix + key + '`');
^
TypeError: Invalid value for schema Array path `matches`
at Schema.add (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\mongoose\lib\schema.js:425:13)
at new Schema (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\mongoose\lib\schema.js:99:10)
at Object.<anonymous> (C:/Users/phara0h/Dropbox/esports-scores.com/nodeTest/src/schemas/tournamentsSchema.js:8:34)
at Module._compile (module.js:570:32)
at loader (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\babel-register\lib\node.js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\babel-register\lib\node.js:154:7)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (C:/Users/phara0h/Dropbox/esports-scores.com/nodeTest/src/schemas/teamsSchema.js:5:1)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Model上实现实例函数.它检查模型实例的字段值expiresAt是否超出特定时间戳.这是我的架构
let MySchema = new mongoose.Schema({
userId : { type : ObjectId , unique : true, required: true },
provider : { type : String, required : true},
expiresAt : { type : Number, required : true}
},{ strict: false });
Run Code Online (Sandbox Code Playgroud)
这是实例方法
MySchema.methods.isExpired = () => {
console.log(this.expiresAt) // undefined
return ( this.expiresAt < (Date.now()-5000) )
};
Run Code Online (Sandbox Code Playgroud)
但是价值this.expiredAt是未定义的.然后我尝试重写该函数如下
MySchema.methods.isExpired = () => {
try{
console.log(this._doc.expiresAt);
console.log((Date.now()-5000));
return (this._doc.expiresAt < (Date.now()-5000));
} catch (e){
console.error(e);
}
}; …Run Code Online (Sandbox Code Playgroud) 在我的Food架构中,我根据其他字段调用了不同的字段yummy.例如:
yummy等于pancake,我的领域是dough和jamyummy等于pizza,我的领域是dough,meat和cheese它在保存文档时按预期工作 - 我只是传递我希望按文档保存的字段,因为除了之外都不需要它们yummy.所以,如果我保存:
{
yummy: 'pizza'
dough: 'thin'
meat : 'peperroni',
cheese: [ObjectId("59a65a4f2170d90b0436ed4b")] // refs to the cheeses collection.
}
Run Code Online (Sandbox Code Playgroud)
我的文件看起来像预期的.
问题出在领域type: Array.当我保存:
{
yummy: 'pancake',
dough: 'thick',
jam: 'blueberry'
}
Run Code Online (Sandbox Code Playgroud)
我的文档保存了一个附加cheese: []字段.在我的模式中,cheese定义如下:
Mongoose.model('Food', {
...
cheese: {
type: [{ type: Mongoose.Schema.ObjectId, ref: 'Cheese' }],
required: false
},
...
});
Run Code Online (Sandbox Code Playgroud)
我检查了mongo是否需要doc将数组字段预定义为空,以防 …
我正在尝试创建一个方法,该方法将基于参数和类似值从集合中获取记录.
其中parm例如是此模式中的_id字段.
getRecord('_id', '1234567876543')
getRecord(parm, value){
db.collection.findOne( { parm : value } , function(err, item) {
if (err) {
console.error(err);
}else if (item === null ) {
console.error('record does not exist');
}else {
Record = JSON.stringify(item);
}
});
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是这段代码试图从不存在的表中获取colum parm,每次返回记录都不存在.
如何在findOne查询中传递参数的值?
进出口新的nodejs.i已经与集合名称PLN名为AQI分贝。我试着去显示所有在收集网页上的记录,但猫鼬总是返回空数组。我曾与其他DBS测试,但我可以从他们那里得到的数据但PLN猫鼬总是返回空数组。我真的很感激,如果有人可以帮助我。这是我的架构
var Pln = new Schema({
latit : Number,
longit : Number,
timestmp : String,
co : Number,
smoke : Number,
O3 : Number,
humidity : Number,
temperature: Number,
co2 : Number,
dust : String
});
var plnModel = mongoose.model('pln', Pln);
Run Code Online (Sandbox Code Playgroud)
这是我的路线。
app.get('/', function(req, res) {
res.contentType('application/json');
plnModel.find({}, function(err, pln) {
if (pln != null) {
console.log('Found the User:' + pln.latit);
res.send(JSON.stringify(pln));
}
});
});
Run Code Online (Sandbox Code Playgroud) 使用 multer gridfs 存储上传的文件我想将它引用到新创建的集合(电影)。我引用上传文件的文件 ID 与上传文件不同,即使电影收藏没有保存到数据库中。我引用上传的文件的文件 ID 与上传的文件不同,即使电影收藏没有保存在数据库中
//movie schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const MovieSchema = new Schema({
description: {
type: String,
},
category: {
type: String,
},
token: {
type: String,
},
fileID: {
type: Schema.Types.ObjectId,
ref: "contents.files"
}
});
module.exports = movies = mongoose.model('movies', MovieSchema);
let gfs;
conn.once('open', () => {
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection('contents');
});
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) …Run Code Online (Sandbox Code Playgroud)