2016-09-28 2 views
1

Par exemple, mon code est ci-dessousEst-ce que MongoDB prend en charge l'opérateur logique dans l'expression de mise à jour?

b = c.test.users.find_one_and_update(
     {'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}, 
     {'$set': {'user_id': '111'}, 
     '$and': [{'device_id': {'$ne': u'c09b46863f953bec1d5c0a1a'}}, 
       {'$set': {'device_id': 'abc'}}]} 

et je reçois une exception OperationFailure: Unknown modifier: $and. Il semble que le MongoDB ne supporte pas l'opérateur logique comme $and dans l'expression de mise à jour. Le fait?


MISE À JOUR (Réponse @chridam):

Le code ci-dessus est juste un exemple qui veulent montrer une situation: trouver un document d'utilisateur avec un spécifié uid, réglez-est user_id, et définir la device_id uniquement lorsque device_id n'est pas égal à une certaine valeur, telle qu'une valeur d'historien.

+1

Seuls les délégués [** opérateurs de mise à jour **] (https://docs.mongodb.com/manual/ reference/operator/update/# id1) peut être utilisé, n'importe quoi d'autre MongoDB se plaindra et jettera une erreur. Pourquoi ne pouvez-vous pas lancer cette opération comme une mise à jour atomique '{'uid': u'52ae5c7a48bd9ffb716bf4f774954d20 ',' device_id ': {' $ ne ': u'c09b46863f953bec1d5c0a1a'}}, {'$ set': {'user_id' : '111', 'device_id': 'abc'}} ', pourquoi inclure les opérateurs logiques là où ils ne devraient pas être? – chridam

+0

pouvez-vous écrire votre schéma de document et le résultat attendu? – TomG

+1

@chridam J'ai mis à jour ma question pour nettoyer ma question. Je vous remercie. –

Répondre

1

Passez d'abord la condition puis mettez à jour le résultat. Vous ne pouvez pas passer deux conditions distinctes comme vous l'avez fait. Essayez ci-dessous:

c.test.users.find_one_and_update(
      {'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}}, 
      {'$set': {'user_id': '111', 'device_id': 'abc'}}, {new: true}, function(err, user){ 
    if(err) return next(err); 
if(user.device_id !== 'c09b46863f953bec1d5c0a1a'){ 
    user.device_id = 'abc'; 
user.save(); 
} 
}) 

MISE À JOUR:

db.example.find_one_and_update(
    {'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}}, 
    {'$set': {'user_id': '111', 'device_id': 'abc'}}, 
    return_document=ReturnDocument.AFTER) 

après avoir obtenu ce résultat, vous pouvez changer en objet retourné puis enregistrez-le.

P.S .: Comme save() est obsolète dans la version 3.0, utilisez si vous utilisez la version> 3.0, replace_one();

< 3,0

var newUser = db.example.find_one_and_update(
     {'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}}, 
     {'$set': {'user_id': '111', 'device_id': 'abc'}}, 
     return_document=ReturnDocument.AFTER); 

if(newUser.device_id !== 'c09b46863f953bec1d5c0a1a'){ 
    newUser.device_id = 'abc'; 
db.example.save(newUser); 
} 

> = 3,0

var newUser = db.example.find_one_and_update(
     {'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}, 
     {'$set': {'user_id': '111', 'device_id': 'abc'}}, 
     return_document=ReturnDocument.AFTER); 

    if(newUser.device_id !== 'c09b46863f953bec1d5c0a1a'){ 
    db.example.replace_one({'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}, {'device_id': 'abc'}) 
} 
+0

Votre réponse a changé mon problème. S'il vous plaît lire ma mise à jour dans la question (je viens de mettre à jour). Je vous remercie. –

+0

@YantaoXie J'ai mis à jour ma réponse Merci de vérifier. – Sachin

+0

Je trouve que le prototype de 'find_one_and_update' est' find_one_and_update (filtre, mise à jour, projection = None, sort = None, return_document = ReturnDocument.BEFORE, ** kwargs) '. Voulez-vous dire 'find_one_and_update (..., ..., projection = {nouveau: vrai}, sort = fonction (err, utilisateur) {...})'? –