0

我正在尝试构建一个 javascript 对象以传递给MongoDB. 该数据库使用一个运算符$or,可让您一次搜索属性中的多个键。

正因为如此,$or运算符不能放在引号中,因为它实际上是查找函数中的运算符。

作为参考,查找函数如下所示:

db.inventory.find( { price:1.99, $or: [ { qty: { $lt: 20 } }, { sale: true } ] } )

我找到了一种$or从一些变量“构建”属性的方法,但由于某种原因,属性名称一直被视为字符串。这是我的代码:

    var criteria = { $or: []};

    properties.forEach(function(property) {
        var propParts = property.split('=');
            if(!(propParts[1].indexOf('&') === -1)){
                var value = propParts[1].match(/[-'"\w\s]+/g);
                    for (var i = 0; i<value.length; i++){
                        var tempObj = {};
                        tempObj[propParts[0]] = value[i];
                        criteria.$or.push(tempObj);
                    }
            }else{       
            criteria[propParts[0]] = new RegExp(propParts[1], "i");
        }
    });

if(criteria.$or.length<=0){
    delete criteria.$or;
}
console.log(criteria);

在我的控制台中,这被输出为:

{ '$or': [ { designer: 'abc' }, { designer: 'def' } ] }

我在其他地方使用类似的代码($push而不是$or),它工作得很好,我以完全相同的方式声明它。

是否可以确保该属性被视为字符串?我怎样才能在这里实现这一目标?

4

1 回答 1

2

Javascript 对象键总是被强制转换为字符串。您可以在对象文字中指定一些不带引号的键{key: 0}或使用点表示法object.key = 0只是键的语法糖,这些键也与标识符的产生相匹配。'$or' 是一个有效的 javascript 标识符,所以你可以说:

{$or: [...]}

或者

{"$or": [...]}

或者

{'$or': [...]}

它们都是等价的。

于 2013-07-29T06:50:57.997 回答