【问题标题】:mongoose save only saving partial document (strict : false)猫鼬只保存部分文档(严格:false)
【发布时间】:2016-06-22 15:15:27
【问题描述】:

我创建了一个额外的集合,用作我的应用程序欢迎屏幕的数据缓存。每小时我都会对我的正常集合运行一组聚合查询,并创建一个新的欢迎屏幕数据对象,我将其添加到我的welcomeScreenData 集合中,并且我的应用程序的欢迎屏幕上只使用该集合中的最新文档。

当我在我的应用程序中使用猫鼬时,我为此缓存集合创建了一个空模式:

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();
  }
});

当我注销我要保存的对象时,它包含三个数组(特色、流行和新),每个数组都是对象数组。

保存后,数据库包含相同的三个数组,但“featured”数组只包含objectIds,而不是完整的对象。我认为使用strict : false 意味着在任何情况下都应该保存整个对象。在这种情况下,什么可能导致整个对象无法保存?

我获取“特色”数组数据的唯一区别是它们来自deep populate 查询的填充部分,但在保存时不只是javascript对象吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    根据文档here。 'Strict' 确保传递给模型构造函数但未在我们的架构中指定的值不会保存到数据库中。

    禁用它会强制 Mongoose 保存那些不属于 Schema 的值。它没有深入填充

    【讨论】:

    • 是的,这就是我希望保存整个对象的原因 - 在保存之前它就在那里,而 strict 是错误的,所以应该没有什么可以阻止它被保存。深度填充是我首先获取数据的方式,不参与保存。
    • 哦,我误解了你的问题。我认为“精选”是一个 ObjectIds 数组,对不起,我的错。是的,你是对的。它应该正确存储没有任何问题。您在 console.log(welcomeScreenData) 中得到正确的结果吗?你试过混合类型吗?
    【解决方案2】:

    它似乎确实与人口稠密有关。在获得深度填充查询的结果后,我正在提取结果的填充部分以写入新集合。在提取我想要的数据之前,我需要在查询结果上使用toObject()

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 2016-07-30
      • 2014-08-03
      • 2014-09-06
      相关资源
      最近更新 更多