【问题标题】:Saving a modified document (with a modified subdocument array) in Mongoose model在 Mongoose 模型中保存修改后的文档(带有修改后的子文档数组)
【发布时间】:2014-03-27 00:17:12
【问题描述】:

我目前拥有的代码是:

User.findOne(
    {
        "subUsers.email" : userEmail
    },
    {
        subUsers : {
            $elemMatch: {
                email : userEmail                            }
        }
    },
    function(err, user){
        if(user){
            var information = user.subUsers[0].information.id(id);

            information.arrayA.push({someId : "something"});

            user.save(callback(err)); // Also tried information.save()
                                      // without luck
        }

        callback(err);
    }
);

这不会返回任何错误,但是当我检查数据库时,新的数组元素还没有被推送(整个文档完好无损)。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 请发布您的架构。
  • 我对mongo不熟悉,但以防万一它与问题有关,user.save(callback(err));的回调可能在最后callback(err);之后被调用。因此,如果存在user,则回调可能会被调用两次。也许你需要if (user){ ... } else { callback(err); } 什么的。
  • 我绝对忘记了“其他”。仍然没有保存,但感谢您的提醒。 :)

标签: javascript node.js mongodb mongoose nosql


【解决方案1】:

您可能应该在这里查看第一个常见问题解答:http://mongoosejs.com/docs/faq.html

Mongoose doesn't create getters/setters for array indexes; without them mongoose never gets 
notified of the change and so doesn't know to persist the new value. The work-around is to 
use [MongooseArray set][1] available in Mongoose >= 3.2.0.

所以在你的情况下,你想添加第三行

var information = user.subUsers[0].information.id(id);
information.arrayA.push({someId : "something"});
user.subUsers.set(0, information);

或者类似的东西。

【讨论】:

  • 感谢您的提示。尝试了“set()”和“markModified()”。但他们都没有工作。 ://
  • 我认为您的代码有一个细微的错误,您可以使用 set 发布更新版本吗?
  • 即使“set”有效,在这种情况下它也没有用,因为我使用 id() 来检索嵌套数组中的元素。看来我和这个其他编码员的情况一样:github.com/LearnBoost/mongoose/issues/1754你知道子子文档保存的任何工作示例吗?我将不胜感激。
【解决方案2】:

截至今天,Mongoose 目前还没有准备好以原子方式进行多级嵌套。

因此,即使是回到某种关系型数据库,在这种情况下最好将嵌套拆分为至少 2 个集合,并使用自动生成的 ObjectId 进行引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2014-06-30
    • 2020-01-20
    • 2012-02-17
    • 2016-10-03
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多