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 に答える