我创建了一个额外的集合,用作我的应用程序欢迎屏幕的数据缓存。每小时我在我的普通集合上运行一组聚合查询,并创建一个欢迎屏幕数据的新对象,我将其添加到我的welcomeScreenData集合中,只有该集合中的最新文档才会在我的应用程序的欢迎屏幕上使用。
当我在我的应用程序中使用mongoose时,我为此缓存集合创建了一个空模式:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var welcomeScreenDataSchema = new Schema({}, { strict : false });
var WelcomeScreenData = mongoose.model('WelcomeScreenData', welcomeScreenDataSchema, 'welcomeScreenData');
module.exports = WelcomeScreenData;
我的查询结果保存到WelcomeScreenData对象:
var welcomeScreenData = new WelcomeScreenData({
featured : results[0],
popular : results[1],
new : results[2]
});
console.log(welcomeScreenData);
welcomeScreenData.save(function(error, welcomeScreenData){
if(error){
callback(error);
}else{
callback();
}
});
当我退出我要保存的对象时,它包含三个数组(特色,流行和新的),每个数组都是一个对象数组。
保存后,数据库包含相同的三个数组,但'特色'数组仅包含objectIds,而不是完整对象。我认为使用strict : false
意味着在任何情况下都应该保存整个对象。在这种情况下,什么可能导致整个对象无法保存?
我获得'特色'的数据的唯一区别数组是它们来自deep populate查询的填充部分,但是在保存点并不是所有内容都只是javascript对象?
答案 0 :(得分:0)
根据文档here。 '严格'确保传递给我们的模型构造函数的未在我们的模式中指定的值不会保存到db。
通过禁用它,您迫使Mongoose甚至保存那些不属于Schema的值。它没有深入填充
答案 1 :(得分:0)
它确实与人口密切相关。在获得深度填充查询的结果后,我正在提取结果的填充部分以写入新集合。在提取我想要的数据之前,我需要在查询结果上使用patch :update, work_id: 1234, data: {}
。