MarkLogic 8 JavaScript数组

MarkLogic 8 JavaScript数组,marklogic,marklogic-8,Marklogic,Marklogic 8,我正在尝试使用数组。这是一些工作代码,解释了我在做什么 // query var a = ["1000", "2000", "3000"]; var b = ["2000"]; for (i in b) { var index = a.indexOf(b[i]); }; if (index > -1) { a.splice(index, 1); }; a 现在,当我对查询结果使用相同的逻辑时,它不再起作用 // query queryDo = cts.and

我正在尝试使用数组。这是一些工作代码,解释了我在做什么

// query

var a = ["1000", "2000", "3000"];
var b = ["2000"];    

for (i in b) {
  var index = a.indexOf(b[i]);
};

if (index > -1) {
    a.splice(index, 1);
};

a
现在,当我对查询结果使用相同的逻辑时,它不再起作用

// query

queryDo = cts.andQuery([
      cts.jsonPropertyValueQuery("displayable", "true"),
      cts.jsonPropertyValueQuery("section", "dikw Track Events"),
      cts.jsonPropertyValueQuery("name", 'dikw_default'),
      cts.collectionQuery(["reference/application"])
    ]);

queryDont = cts.andQuery([
      cts.jsonPropertyValueQuery("displayable", "false"),
      cts.jsonPropertyValueQuery("section", "dikw Track Events"),
      cts.jsonPropertyValueQuery("name", 'Helpdesk'),
      cts.collectionQuery(["reference/application"])
    ]);

var qDo = cts.jsonPropertyWords("code", null, "document", queryDo).toArray();
var qDont = cts.jsonPropertyWords("code", null, "document", queryDont).toArray();

for (i in qDont) {
  var index = qDo.indexOf(qDont[i]);
};

if (index > -1) {
    qDo.splice(index, 1);
};

qDo
我已经验证了两个查询的结果都是数组。数组由值组成,就像示例代码一样;1000、2000等。 另外,当我使用notAndQuery从第一个查询中排除第二个查询的结果时,这没有效果

例如,当我看qDo[2]时,返回了正确的值

我的andNotQuery:

queryDo = cts.andQuery([
      cts.jsonPropertyValueQuery("displayable", "true"),
      cts.jsonPropertyValueQuery("section", "dikw Track Events"),
      cts.jsonPropertyValueQuery("name", 'dikw_default'),
      cts.collectionQuery(["reference/application"])
    ]);

queryDont = cts.andQuery([
      cts.jsonPropertyValueQuery("displayable", "false"),
      cts.jsonPropertyValueQuery("section", "dikw Track Events"),
      cts.jsonPropertyValueQuery("name", 'Helpdesk'),
      cts.collectionQuery(["reference/application"])
    ]);

andnot = cts.andNotQuery(queryDo, queryDont);

result = cts.jsonPropertyWords("code", null, "document", andnot);

我认为你的逻辑有缺陷。最后的if似乎放错了地方。如果使用数字扩展示例以包含另一个值,则会出现错误:

var a = ["1000", "2000", "3000", "4000"];
var b = ["2000", "3000"];    

for (i in b) {
  var index = a.indexOf(b[i]);
};

if (index > -1) {
    a.splice(index, 1);
};

a
相反,if应该在for循环中:

var a = ["1000", "2000", "3000", "4000"];
var b = ["2000", "3000"];    

for (i in b) {
  var index = a.indexOf(b[i]);

  if (index > -1) {
      a.splice(index, 1);
  };
};

a
但以某种方式使用notQuery可能是值得探索的。根据数据的布局,这可能会起作用。这也会更有效率,因为在搜索之后您不必进行自定义筛选


for/in运算符可能没有按预期的方式在数组上迭代:

“不能保证for…in将以任何特定顺序返回索引,并返回所有可枚举属性,包括具有非整数名称的属性和继承的属性。”

此外,for/In可能会抑制v8中的优化:

如果您使用熟悉的
for(var i=0;i
语句,这会产生预期的结果吗


希望这能有所帮助,

在MarkLogic提交了一个bug后,我从工程团队得到了以下回复:

“lexicon调用返回的是
StringWithFrequency
(而不仅仅是 字符串)因此JS层将其包装”

您可以像以前一样通过调用
cts.jsonPropertyWords
创建一个数组,但首先需要遍历并依次获取每个项的字符串值。大概是这样的:

  • 与前面一样,从
    cts.jsonPropertyWord创建数组
  • 创建一个新数组
  • 遍历原始数组并将每个项的字符串值推送到新数组中。对
    indexOf
    的调用将在新数组上起作用
  • 解决问题

    var trackCodes = cts.jsonPropertyWords("code", null, "document", cts.andQuery([])).toArray();
    var tc2 = new Array();
    
    for (var i = 0; i < trackCodes.length; i++){
      tc2.push(trackCodes[i].toString())
    }
    
    tc2.indexOf(["your value"])
    
    var trackCodes=cts.jsonPropertyWords(“code”,null,“document”,cts.andQuery([])).toArray();
    var tc2=新数组();
    对于(变量i=0;i
    我已经更改了代码,以反映您对数组b上的循环所做的更改。还包括我的andNotQuery。我认为您的andNot查询需要更具选择性。您在queryDo和queryDont中都有一个集合查询。因此,使用andNotQuery可以得到
    collection ref/app而不是collection ref/app
    。:)区别在于这一行:cts.jsonPropertyValueQuery(“name”,“Helpdesk”),我已经测试了查询en 1返回1000、2000、3000,其他返回2000。使用andNot的结果仍然是整个第一个序列。我也遇到了这个问题,使用经典的for循环对我很有效。