2013-01-09 3 views
3

Possible en double:
Can mongo upsert data?Upsert un sous-document en utilisant mangouste

Je schémas définis comme suit:

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

Je suis en train de soit correspondance et mettre à jour un sous-document row (dans mon cas, 'permissions', ou insérez une nouvelle ligne permissins si aucune correspondance (par exemple upsert)

Voici ce que je l'ai écrit:

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 semble accepter (par exemple pas d'erreurs), mais il n'y a pas de changement dans la base de données. J'ai également essayé le suivant dans le shell mongo:

db.orgs.update({"name":"my_org", "permissions.$._id":"[email protected]"}, {$set: {"permissions.$.role": "member"}}); 

Encore une fois, Mongo a accepté la requête, mais pas de changement. Voici le document que j'essaie de modifier:

{ 
    "name" : "my_org", 
    "permissions" : [ 
     { 
      "_id" : "[email protected]", 
      "role" : "admin" 
     } 
    ] 
} 

Des suggestions? Un grand merci

Répondre

0

Cela fonctionne pour moi avec $elemMatch, vérifier également la rules for the $ operator:

db.orgs.update({"name":"my_org", "permissions": {$elemMatch: {_id:"[email protected]"}}}, 
    {$set: {"permissions.$.role": "member"}}); 
+1

Merci. Cela fonctionne pour moi de mettre à jour une entrée existante, mais il n'insère pas une entrée inexistante (j'ai ajouté upsert = true également). Avez-vous des conseils sur la façon dont l'upsert fonctionnerait ici? –

+0

Je pense que votre chance sur l'upsert. L'opérateur "$" doc met spécifiquement en garde contre son utilisation pour les opérations "upsert". – mjhm