2016-07-13 12 views
0

Ich habe einige Probleme bei der Suche nach einem Weg zu Update, d. H. Ändern oder löschen Sie ein bestimmtes Dokument in einer eingebetteten Liste. Hier ist mein Fall:Was ist der richtige Weg, um ein Dokument in einer eingebetteten Liste zu aktualisieren?

CREATE CLASS Tag EXTENDS V 
CREATE PROPERTY Tag.label STRING 
CREATE CLASS Profession 
CREATE PROPERTY Profession.jobtitle STRING 
CREATE PROPERTY Profession.tags LINKSET Tag 
CREATE CLASS UserProfile EXTENDS V 
CREATE PROPERTY UserProfile.screenname STRING 
CREATE PROPERTY UserProfile.profession EMBEDDEDLIST Profession 

Also, einen Beitrag für UserProfile.profession ist kein Problem:

UPDATE UserProfile ADD profession = 
    {"@type":"d","@class":"Profession","jobtitle":"Actress", "tags" : ["#22:5"]} 
WHERE screenname = 'emma' 

einiger Eintrag 'emma' für Userprofile und einen Tag mit der ID # 22 Gegeben: 5.

Wenn ich jedoch versuche, das Beruf-Dokument mit dem Arbeitstitel 'Schauspielerin' zu aktualisieren, wie soll ich dann vorgehen? Ich habe versucht, den folgenden Ansatz, die mit gearbeitet, aber ein Eintrag in der Liste nur:

UPDATE UserProfile SET profession = 
    {"@type":"d","@class":"Profession","jobtitle":"Actress", "tags" : ["#22:7", "#22:9"]} 
WHERE profession.jobtitle = 'Actress' 
    AND screenname = 'emma' 

Diese Aussage wirft keine Ausnahme und gibt 0 zurück, als die Anzahl betroffenen Datensätze.

Allgemein: Wie greife ich auf einen bestimmten Eintrag (mit einem Schlüssel des Dokuments selbst) in einer eingebetteten Liste oder einem Satz zu aktualisieren oder zu entfernen?

Außerdem: gibt es eine einfachere Möglichkeit, die Tags linkset im Profession-Dokument in der eingebetteten Liste zu aktualisieren? Oder muss ich immer das ganze Dokument bekommen und eine modifizierte Version zurück schreiben?

Danke!
Ingo

Antwort

0

können Sie

UPDATE UserProfile set profession = [{"@type":"d","@class":"Profession","jobtitle":"Actress", "tags" : ["#22:7", "#22:9"]}] 
WHERE profession.jobtitle contains "Actress" AND screenname = 'emma' 

UPDATE

verwenden Sie diese Javascript-Funktion

var g=orient.getGraph(); 
var b=g.command("sql","select from userprofile"); 
var tag1=g.command("sql","select from #22:7"); 
var tag2=g.command("sql","select from #22:9"); 
for(i=0;i<b.length;i++){ 
    var screenname= b[i].getProperty("screenname"); 
    if(screenname=="emma"){ 
     var pro=b[i].getProperty("profession"); 
     for(j=0;j<pro.length;j++){ 
      if(pro[j].field("jobtitle")=="Actress"){ 
       pro[j].field("tags",[tag1[0],tag2[0]]); 
      }  
     } 
     b[i].save(); 
    } 
} 
+0

Vielen Dank für diese Antwort, aber der Befehl ersetzt die Liste eher durch eine neue, d. H. Wenn zwei oder mehr Einträge in der Berufsliste nach dem UPDATE sind, bleibt nur der neue Eintrag erhalten. –

+0

Ich habe meine Antwort aktualisiert –

0

dieses

UPDATE UserProfile SET profession.jobtitle = 'aaaa' 
WHERE profession.jobtitle = 'Actress' 
    AND screenname = 'emma' 
versuchen verwenden könnte
+0

Dies funktioniert, solange es nur ein Element in der Berufsliste gibt. - Danke trotzdem! ;) –