【问题标题】:Not able to persist array of objects in mongo using mongoose无法使用 mongoose 在 mongo 中持久化对象数组
【发布时间】:2015-11-02 11:40:35
【问题描述】:

我正在尝试使用 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);

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

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

我尝试使用

调试 mongo 命令

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

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

谁能告诉我如何将这个对象数组存储在我的架构中?

谢谢,

更新:

时间太长了,我仍然无法找出问题的根本原因。 github上有一个很长的线程。 https://github.com/Automattic/mongoose/issues/3249 我希望其他专家看看并建议我一些可以解决问题的方法。我真的被困在这个问题上。

更新 2:

到目前为止,没有一个解决方案适合我,所以我决定只修改架构以满足我的要求。这导致了另一个问题:

我想创建一个以 objectId 作为键并以字符串值数组作为其值的映射。我能得到的最接近的是:

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

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

谁能告诉我架构是否正确?另外,如何使用 {upsert: true} 对此架构执行更新?

另外,如果上述不正确并且无法实现,那么我该如何通过其他方式来模拟我的要求。我的用例是我想保留给定 objectId 的值列表。我不希望任何具有相同键的重复条目,这就是选择地图的原因。

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

谢谢

【问题讨论】:

  • 您可能想让更新 2 成为一个不同的问题,因为它完全不同。
  • 通过 {upsert:true} 更新,您的意思是在地图中插入一个元素,如果 myId 已经存在则替换它?您是否考虑过为它创建一个单独的集合,而不是将它们嵌入到地图中?
  • @phillee:我为更新 2 创建了一个单独的帖子stackoverflow.com/questions/32038606/…
  • @phillee:是的,如果给定的 myId 已经有一个条目,另一个插入应该更新前一个。我认为创建一个单独的集合不是基于数据库设计的正确方法,我认为给定的 objectId 和相应的值应该有一些映射作为字符串数组

标签: node.js mongodb express mongoose


【解决方案1】:

你试过了吗

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

?

【讨论】:

  • 我试过这个,但这也不起作用。它仍然没有为 PagesData 字段设置正确的值
【解决方案2】:

我对此进行了测试,插入对我有用,使用以下内容: (我不得不删除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;
            }
        });

【讨论】:

  • 你能看看github讨论吗。您可以看到查询中发生了变化。我现在正在使用更新查询。另外,我在那里写了一个详细的问题。给你一个我遇到的确切问题会很有帮助
  • 好的,我去看看,但是在两个不同的论坛上进行两次讨论有点令人困惑
  • 我同意,事实上早先我想只在 github 上发布它,但因为要覆盖更广泛的受众,我决定也在这里创建一个线程。另外,我一定会尽量让这两者保持同步。
  • 好的,您在另一篇文章中有一个名为 type 的字段。我认为猫鼬对此感到困惑。尝试将字段更改为 login_type 或类似的内容。
  • 我尝试改变它,但仍然无法解决问题。另外,请查看github.com/Automattic/mongoose/issues/… 你认为这可能是一个问题吗?
【解决方案3】:

我尝试了您在此处提供的确切代码,它对我有用。我不确定是什么导致了您的问题。除非我们遇到同样的问题,否则很难纠正它。 以下是一些您可以尝试的建议:

  1. 创建一个简单的模式并尝试存储对象,这样您就可以 弄清楚它是否与架构有关。
  2. 您可以在示例应用程序中试用您的架构,看看是否有 依赖导致了问题。

一旦您知道问题出在哪里,您也可以找到解决方案。希望对你有帮助。

【讨论】:

    【解决方案4】:

    要创建多个 pageData,您可以将其用作嵌入式集合,而不是使用数组。

    架构如下:

    var PagesDataSchema = new Scheme({
    
        pageAccessToken: {type: String, get: decryptText, set: encryptText},
        category: String,
        name: String,
        id: String,
        perms: [String]
    })
    var ProfileSchema = new Schema({
    
      name: String,
      PagesData: [PagesDataSchema]
    
    });
    
    module.exports = mongoose.model('Profile', ProfileSchema);
    

    参考http://mongoosejs.com/docs/subdocs.html

    对于保存您可以使用的文档。

    exports.save = function(req,res){
    var test = new ProfileSchema;  // new object for ProfileSchema domain.
    test.name= req.body.name;
    if(req.body.PagesData){
     req.body.PagesData.forEach(function(page){  // For every element of pageData from   client.
        test.PagesData.push(page)  // This pushes each and every pagedata given from the client into PagesData.
    })
    }
    test.save(function (saveErr, saved) {  // Saves the new document into db.
    if (saveErr) {
        console.log(saveErr)
        return;
    }
    res.status(HttpStatus.OK).json(saved);
    });
    };
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      相关资源
      最近更新 更多