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循环对我很有效。