我正在设计一个类似于mongo的数据库,它采用面向对象的查询语句,使得每个周期性分隔的引用可以是函数或对象引用:
foo.users.find( args );
foo.users.remove( args );
其中args是JSON编码的对象字符串。
我的数据库支持的每个函数必须带一个指向当前操作结果集的指针(由obj给出)以及一个比较器对象,类似于mongo中的那些。
remove:function(obj,comp){
comp = JSON.parse(comp);
var result = [];
for(var i =obj.length-1;i>=0;--i){
/**For each object in the array*/
var match = true;
for(var key in comp){
/**For each comparator field*/
for(var test in comp[key]){
/**For each logical comparator test*/
if(comparators[test](obj[i][key],comp[key]) == false){
/**A logical test failed, this item does not match
all the criteria*/
match=false;
break;
}
}
}
if(match == true){
/**The item matches the given criteria*/
result.push( obj.slice(i,i+1)[0] );
}
}
return result;
}
在我的特定用例中,查询:
users.remove({"username":{"$eq":"Hello_World"}})
无法正常工作,即使以相同方式对同一数据集进行操作的其他查询也能正常工作。 '用户'引用指向树上某个对象数组的位置,它包含相应的用户对象。
应该对树进行永久性更改,但目前还没有这样做。对树的进一步查询将揭示用户" Hello_World"从未被删除,并且是有效的用户。
未对' obj'进行任何更改。外部类似功能。此外,返回应该是具有1个对象的对象数组,但是不包含任何对象。
答案 0 :(得分:0)
我找到并解决了这些问题:
我在第3个嵌套循环中的比较器测试应改为:
if(comparators [test](obj [i] [key],comp [key] [test])== false){
}
最后,它按照指示工作,现在更大更好的事情