【问题标题】:Upsert a subdocument using mongoose [duplicate]使用 mongoose 插入子文档 [重复]
【发布时间】:2013-01-10 09:31:15
【问题描述】:

可能重复:
Can mongo upsert data?

我的模式定义如下:

var Permission = new Schema({
  _id: String,  // email address
  role: String  // "admin" or "member"
});

var Org = new Schema({
  name: {type: String, index: {unique: true, dropDups: true}, trim: true},
  permissions: [Permission]
});

我正在尝试匹配和更新子文档行(在我的情况下为“权限”,或者如果不匹配(例如 upsert)插入一个新的权限行。

这是我写的:

exports.updatePermissions = function(req, res) {
  return Org
    .update(
      {name:"my_org", "permissions.$._id": req.body.email},
      {$set: {"permissions.$.role": req.body.role}})
    .exec(function(err) {
      // stuff
    });
};

MongoDB 似乎接受了这一点(例如,没有错误),但数据库中没有任何变化。我也在 mongo shell 中尝试了以下操作:

db.orgs.update({"name":"my_org", "permissions.$._id":"newuser@email.com"}, {$set: {"permissions.$.role": "member"}});

Mongo 再次接受了查询,但没有任何变化。这是我要修改的文档:

{
    "name" : "my_org",
    "permissions" : [
        {
            "_id" : "newuser@email.com",
            "role" : "admin"
        }
    ]
}

有什么建议吗?非常感谢

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    这对我有用$elemMatch,也可以查看rules for the $ operator:

    db.orgs.update({"name":"my_org", "permissions": {$elemMatch: {_id:"newuser@email.com"}}},
         {$set: {"permissions.$.role": "member"}});
    

    【讨论】:

    • 谢谢。这适用于我更新现有条目,但它不会插入不存在的条目(我也添加了 upsert=true )。你对 upsert 如何在这里工作有什么建议吗?
    • 我认为你在 upsert 上不走运。 "$" 运算符文档特别警告不要将其用于 "upsert" 操作。
    猜你喜欢
    • 2016-12-14
    • 2012-11-04
    • 2020-12-26
    • 2021-05-11
    • 2021-01-10
    • 2012-04-14
    • 2018-09-04
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多