3

重複の可能性:
mongo はデータをアップサートできますか?

次のように定義されたスキーマがあります。

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 はこれを受け入れているようですが (たとえば、エラーはありません)、DB に変更はありません。mongoシェルでも次のことを試しました:

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"
        }
    ]
}

助言がありますか?どうもありがとう

4

1 に答える 1

0

これは$elemMatchで機能します。また、$演算子のルールも確認してください。

db.orgs.update({"name":"my_org", "permissions": {$elemMatch: {_id:"newuser@email.com"}}},
     {$set: {"permissions.$.role": "member"}});
于 2013-01-10T01:31:15.243 に答える