无法使用mongoose在mongo中持久保存对象数组

dar*_*dow 6 mongoose mongodb node.js express

我正在尝试使用mongoose在文档中保留一组对象.我已经尝试了多次,但它不是在文档中持久化数组.它在文档中放置一个空数组.

以下是我的架构:

var ProfileSchema = new Schema({

  name: String,
  PagesData: [{
    pageAccessToken: {type: String, get: decryptText, set: encryptText},
    category: String,
    name: String,
    id: String,
    perms: [String]
  }]

});

module.exports = mongoose.model('Profile', ProfileSchema);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下查询保存包含对象数组的文档:

var newProfile = new Profile();
newProfile.name = "someName";
newProfile.PagesData = [ { pageAccessToken: 'someToken',
    category: 'Bags/Luggage',
    name: 'someBrandName',
    id: '12345',
    perms: 
     [ 'ADMINISTER',
       'EDIT_PROFILE',
       'CREATE_CONTENT' ] } ];

newProfile.save(function(err, result, numAffected){
    if(err) {
        console.log(err);
        res.send(500, "Error");
    }
    console.log(result);
    res.send(200, "Success");
});
Run Code Online (Sandbox Code Playgroud)

我尝试使用调试mongo命令

require('mongoose').set('debug',true)

在调试日志中显示,在插入命令执行期间清空数组.

任何人都可以告诉我如何在我的架构中存储这个对象数组?

谢谢,

更新:

这太久了,我仍然无法找出问题的根本原因.为此,github上有一个很长的线程. https://github.com/Automattic/mongoose/issues/3249 我希望其他专家请一看,并建议我以某种方式解决问题.我真的很困惑.

更新2:

到目前为止,解决方案都没有对我有用,因此我决定仅修改架构以满足我的要求.这导致了一个不同的问题:

我想创建一个mapId作为键的映射和一个字符串值数组作为其值.我能得到的最接近的是:

var schema = new Schema({
   map: [{myId: {type:mongoose.Schema.Types.ObjectId, ref: 'MyOtherCollection'}, values: [String]}]
});
Run Code Online (Sandbox Code Playgroud)

但不知何故,这对我不起作用.当我使用{upsert:true}执行更新时,它无法正确填充地图中的键:值.事实上,我甚至不确定我是否正确地声明了架构.

任何人都可以告诉我架构是否正确?另外,如何使用{upsert:true}为此架构执行更新?

此外,如果上述情况不正确且无法实现,那么我如何通过其他方式对我的需求进行建模.我的用例是我想保留给定objectId的值列表.我不希望任何带有相同键的重复条目,这就是选择地图的原因.

请建议方法是否正确或是否应该以其他方式建模?

谢谢

Rud*_*dra 8

我尝试了你在这里提供的确切代码,它对我有用.我不确定是什么原因导致了这个问题.除非我们得到同样的问题,否则很难纠正它.以下是您可能尝试的一些建议:

  1. 创建一个简单的模式并尝试存储该对象,这样您就可以弄清楚它是否必须对模式执行某些操作.
  2. 您可以在示例应用程序中试用您的架构,以查找某些依赖项是否导致问题.

一旦你知道问题究竟在哪里,你就能找到解决方案.我希望它有所帮助.


Sta*_*rns 5

我测试了这个,插件适用于我使用下面:(我不得不删除get:decryptText,set:encryptText)

var n = { name: "Testing for mongoose", PagesData : [{ pageAccessToken: 'someToken',
    category: 'Bags/Luggage',
    name: 'someBrandName',
    id: '12345',
    perms: 
     [ 'ADMINISTER',
       'EDIT_PROFILE',
       'CREATE_CONTENT' ] } ] }



Profile.create(n, function (err) {
            if (!err) {

                return 'records saved successfully';
            }
            else {

                return error on save:' + err;
            }
        });
Run Code Online (Sandbox Code Playgroud)

DB结果截图:


Pat*_*sai 0

你有没有尝试过

Profile.create({
  name: "someName",
  PagesData: [
    {
      pageAccessToken: 'someToken',
      category: 'Bags/Luggage',
      name: 'someBrandName',
      id: '12345',
      perms: [
        'ADMINISTER',
        'EDIT_PROFILE',
        'CREATE_CONTENT'
      ]
    }
  ]
}, function(err, profile) {
    // do your stuff
})
Run Code Online (Sandbox Code Playgroud)