2014-07-16 4 views
0

Supposons que c'est mon document:Créer ou une fusion intelligente avec MongoDB

public class ElcoRequest 
{ 
    public ObjectId Id { get; set; } 

    public int Result { get; set; } 

    public List<string> Equations { get; set; } 

} 

Les utilisateurs me envoient beaucoup d'équations. Je résous l'équation et enregistre le résultat et l'équation source dans un document dans MongoDB.

Maintenant, de nombreuses équations peuvent être avec le même résultat.

Avant de créer un nouveau document dans db, je veux d'abord vérifier que le même résultat n'existe pas. Si le résultat demandé existe, il suffit de modifier le résultat existant avec une nouvelle équation. Quelque chose comme ceci:

doc.Equations.add(newOne); 

S'il vous plaît accorder une attention au fait que processus est multi-thread. Ainsi, chaque document peut être modifié \ supprimé \ inséré à partir de plus d'un thread. Sur les bases de données relatives, cela me rappelle la transaction.

À la recherche de conseils de mise en œuvre.

Merci!

Répondre

1

Vous devez créer une mise à jour de document, interroger le document existant et ajouter les équations s'il le trouve. Si ce n'est pas le cas, il insère un nouveau document à la place. Vous faites cela en utilisant le drapeau UpdateFlags.Upsert:

collection.Update(
    Query.And(Query<ElcoRequest>.EQ(r => r.Id, newRequest.Id), 
     Query<ElcoRequest>.EQ(r => r.Result, newRequest.Result)), 
    Update<ElcoRequest>.PushAll(r => r.Equations, newRequest.Equations), 
    UpdateFlags.Upsert); 
+0

Est-ce que le fil est sûr? Que faire si je cours ce code à partir de plusieurs programmes (aka processus-safe)? – No1Lives4Ever

+0

@ No1Lives4Ever Oui, mongo possède un verrou au niveau de la base de données. – i3arnon

Questions connexes