使用类似mongo的动态表达式从数组中删除特定元素

时间:2015-12-01 00:06:46

标签: javascript node.js mongodb-query

我正在设计一个类似于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个对象的对象数组,但是不包含任何对象。

1 个答案:

答案 0 :(得分:0)

我找到并解决了这些问题:

  1. 我在第3个嵌套循环中的比较器测试应改为:

    if(comparators [test](obj [i] [key],comp [key] [test])== false){

  2. }

    1. 尝试obj.splice()而不是obj.slice()。我能看到的唯一逻辑是我的NodeJS环境不支持该功能(我通常认为不是这样)。
    2. 最后,它按照指示工作,现在更大更好的事情