web-dev-qa-db-fra.com

$ Push et $ set dans la même mise à jour MongoDB

J'essaie d'utiliser Java Java de MongoDB pour effectuer deux mises à jour ($ set et $ Push) sur un enregistrement dans la même opération. J'utilise un code similaire au suivant:

    BasicDBObject pushUpdate = new BasicDBObject().append("$Push", new BasicDBObject().append("values", dboVital));
    BasicDBObject setUpdate = new BasicDBObject().append("$set", new BasicDBObject().append("endTime", time));
    BasicDBList combinedUpdate = new BasicDBList();
    combinedUpdate.add( pushUpdate);        
    combinedUpdate.add( setUpdate);


    collection.update( new BasicDBObject().append("_id", pageId), combinedUpdate, true, false);

Lorsque je combine $ set et $ Push dans la même mise à jour via un BasicDBList, j'obtiens une exception IllegalArgumentException: "les champs stockés dans la base de données ne peuvent pas commencer par '$' (mauvaise clé: '$ Push')".

Si je fais deux mises à jour distinctes, pushUpdate et setUpdate produisent des résultats valides.

Merci!

30
HolySamosa

Je ne sais pas Java, mais devez-vous y créer une liste? Que se passe-t-il si vous essayez ce code?

BasicDBObject update = new BasicDBObject().append("$Push", new BasicDBObject().append("values", dboVital));
update = update.append("$set", new BasicDBObject().append("endTime", time));

collection.update( new BasicDBObject().append("_id", pageId), update, true, false);

Cela devrait produire l'équivalent de

db.collection.update({_id: pageId}, {$Push: {values: dboVital}, $set: {endTime: time}});

Alors que votre code produit (je soupçonne) ceci:

db.collection.update({_id: pageId}, [{$Push: {values: dboVital}}, {$set: {endTime: time}}]);
50
Sergio Tulentsev

Ma version mongodb est 3.4.20 et lors de l'utilisation

db.collection.update({_id: pageId}, [{$Push: {values: dboVital}}, {$set: {endTime: time}}]);

J'ai reçu une erreur

[thread1] Error: field names cannot start with $ [$Push] :

Pour résoudre cette erreur, nous pouvons utiliser:

db.collection.update({_id: pageId}, {$Push: {values: dboVital}, $set: {endTime: time}});
0
arpan