app.js
Match.find({}).lean().exec(function(err, matches) {});
Match.findById(id).lean().exec(function(err, match) {});我在不同的路线上使用这两种查询。
匹配-模型:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var messageSchema = new Schema({
// ...
message: {type: String, required: true},
}, {
timestamps: true
});
var matchSchema = new Schema({
// ...
messages: [messageSchema]
}, {
timestamps: true
});
matchSchema.post('find', function(result) {
result.forEach(function(chat) {
chat.messages.forEach(function(message) {
message.createdAt = new Date(message.createdAt).getTime();
message.updatedAt = new Date(message.updatedAt).getTime();
});
});
});
matchSchema.post('findOne', function(result) {
if (result !== null) {
result.messages.forEach(function(message) {
message.createdAt = new Date(message.createdAt).getTime();
message.updatedAt = new Date(message.updatedAt).getTime();
});
}
});
var Match = mongoose.model('Match', matchSchema);
module.exports = Match;在Java中解析默认的日期格式(如2016-05-19T13:29:07.731Z) (我在客户端使用)是很痛苦的,这就是为什么我用unix时间戳来覆盖它的原因,这在Java中很容易格式化。问题是,我有重复的代码(message.createdAt =.和message.updatedAt .)find和findOne。是否有一个同时用于查询find和findByID的钩子?所以我只需要写一次代码?因为find不会触发findById。
发布于 2016-06-01 17:35:04
由于这两个钩子看起来非常相似,所以可以将它们组合成一个函数,由所有(类似)钩子使用:
function processResult(result) {
if (result) {
if (! Array.isArray(result)) {
result = [ result ];
}
result.forEach(function(chat) {
chat.messages.forEach(function(message) {
message.createdAt = new Date(message.createdAt).getTime();
message.updatedAt = new Date(message.updatedAt).getTime();
});
});
}
}
matchSchema.post('find', processResult);
matchSchema.post('findOne', processResult);我相信findOne会触发findById,所以这也应该包括在内。
发布于 2021-04-01 08:46:15
对于仍在搜索该函数的任何人,在每个数据库访问函数之后都会调用一个钩子。
schema.post('init', function(doc) {
console.log('%s has been initialized from the db', doc._id);
});这个钩子唯一的问题是,它是同步的,不能处理承诺。
这里有文档:https://mongoosejs.com/docs/middleware.html#synchronous
https://stackoverflow.com/questions/37574834
复制相似问题