我是mongoose的新手,作为更新Mongo的方法。我正在使用nmap来映射我的网络,并提供对打开的服务器和端口的一些可见性(作为更大策略的一部分)。策略的这一部分也从CHEF和vSphere中提取信息,这些信息都在GUI中链接在一起。这些部分只是简单的单级对象并且工作正常,但NMAP部分具有父/子对象模型。对象模型有一个Server对象和一个Port对象 - 两者都添加了OnOn和updatedOn日期。
不幸的是,预保存的mongoose钩子只针对子对象(每个对象)而不是父对象触发 - 尽管父对象被保存。 我真的希望父对象也有addOn和updatedOn日期。我似乎无法弄明白。提前致谢
免责声明,以下代码将以民间故事,ramda和免费形式编写的较大应用程序中删除。
NodeJs 5.1,Mongoose 4.4.1
port.js文件
const mongoose = require('mongoose');
const Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
const PortSchema = new Schema({
id : ObjectId,
port : String,
protocol : String,
application : String,
addedOn : { type: Date, default: Date.now, setDefaultsOnInsert: true },
updatedOn : { type: Date, default: Date.now }
});
PortSchema.pre('save', function(next){
this.update({},{
$set: {
updatedOn: new Date()
}
})
next();
});
module.exports.model = mongoose.model('Port', PortSchema)
module.exports.schema = PortSchema
server.js文件
const mongoose = require('mongoose');
const PortSchema = require('./port').schema
const Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
const ServerSchema = new Schema({
id : ObjectId,
address : String,
addressType : String,
ports : [PortSchema],
addedOn : { type: Date, default: Date.now, setDefaultsOnInsert: true },
updatedOn : { type: Date, default: Date.now }
});
ServerSchema.pre('save', function(next){
this.update({},{
$set: {
updatedOn: new Date()
}
})
next();
});
module.exports.model = mongoose.model('Server', ServerSchema)
module.exports.schema = ServerSchema
在我的应用程序中插入代码
// nmapUpsert :: (criteria, {}) => Task {ok :: int, ...}
const nmapUpsert = adapt.findOneAndUpdate(Server)
// persist :: [{address :: string, ...}] => [Task {ok :: int, ...}]
const persistNmap = R.map((data) => {
return nmapUpsert({ "address": data.address }, data)
})
这是我的模特 - > task upsert adapter(adapt.findOneAndUpdate)
module.exports.findOneAndUpdate = (originalModel) => {
return (criteria, record) => {
return new Task((reject, resolve) => {
const callback = (error, updatedModel) => {
if (error) {
reject(error)
}
else {
if(!updatedModel) {
resolve(null)
}else {
// this looks to be required to apply defaults from the Schema
updatedModel.save((error) => {
if (error) {
reject(error)
}
resolve(updatedModel)
})
}
}
}
originalModel.findOneAndUpdate(criteria, record, {upsert: true}, callback)
})
}
}
不可否认,最后一个功能有点笨拙 - 但我只想在清理之前弄清楚这一点。
答案 0 :(得分:0)
如果我将钩子更改为findOneAndUpdate,我会获得更好的行为。服务器对象inserten上的addedOn(以及updatedOn),然后只更新updatedOn。不幸的是,整个Ports对象集合都被替换 - 即使在更新时 - 并且addedOn和updatedOn都会在那时得到更新。
port.js文件
const mongoose = require('mongoose');
const Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
const PortSchema = new Schema({
id : ObjectId,
port : String,
protocol : String,
application : String,
addedOn : { type: Date, default: Date.now, setDefaultsOnInsert: true },
updatedOn : { type: Date, default: Date.now }
});
PortSchema.pre('findOneAndUpdate', function(next){
this.update({},{
$set: {
updatedOn: new Date()
}
})
next();
});
module.exports.model = mongoose.model('Port', PortSchema)
module.exports.schema = PortSchema
server.js文件
const mongoose = require('mongoose');
const PortSchema = require('./port').schema
const Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
const ServerSchema = new Schema({
id : ObjectId,
address : String,
addressType : String,
ports : [PortSchema],
addedOn : { type: Date, default: Date.now, setDefaultsOnInsert: true },
updatedOn : { type: Date, default: Date.now }
});
ServerSchema.pre('findOneAndUpdate', function(next){
this.update({},{
$set: {
updatedOn: new Date()
}
})
next();
});
module.exports.model = mongoose.model('Server', ServerSchema)
module.exports.schema = ServerSchema