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

Removing particular elements from an array using dynamic, mongo-like expressions

本文关键字:数组 删除 元素 表达式 mongo 动态      更新时间:2023-09-26

我正在设计一个类似于light-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. 我在第三个嵌套循环中的比较器测试应该是:

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

}

  1. 代替obj.slice(),尝试obj.splice()。我能看到的唯一逻辑是我的NodeJS环境不支持该函数(我通常会认为不是这样)

最后,它按照指示工作,现在做更大更好的事情