在嵌入式列表中更新文档的正确方法是什么?

时间:2016-07-13 13:09:30

标签: orientdb

我在找到更新的方法时遇到了一些麻烦,即修改或删除嵌入列表中的某个文档。这是我的情况:

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

因此,向UserProfile.profession添加条目是没有问题的:

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

考虑到一些条目' emma'对于UserProfile和id为#22:5的标记。

但是,当我尝试使用职位名称' Actress'更新职业文档时,我该怎么办?我尝试了以下方法,该方法仅适用于列表中的一个条目:

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

此语句不会抛出任何异常,并返回0作为受影响记录的数量。

一般情况下:如何在嵌入式列表中访问特定条目(使用文档本身的密钥)或设置为更新或删除它?

另外:是否有更简单的方法来更新嵌入式列表中Profession文档中的标签链接集?或者我是否总是需要获取整个文档并重新编写修改后的版本?

谢谢!
INGO

2 个答案:

答案 0 :(得分:0)

您可以使用

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

<强>更新

你可以使用这个javascript函数

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

答案 1 :(得分:0)

试试这个

UPDATE UserProfile SET profession.jobtitle = 'aaaa'
WHERE profession.jobtitle = 'Actress'
  AND screenname = 'emma'