我正在创建一个动态javascript对象来从mongodb查询,我的代码如下,
_.each(separatedFilter, function (str) {
const filter = str.split('=');
console.log('filter is', JSON.stringify(filter));
if (filter[1] && filter[1].trim() !== '') {
var key = `${filter[0]}`;
var obj = {};
obj[key] = filter[1];
if (key = 'date.start:{$gte') {
key = '"date.start":{"$gte"';
}
if (key = 'date.end:{$lt') {
key = '"date.end":{"$lt"';
}
query.push(obj);
}
});
上面的代码创建了一个对象,如下所示,
{ '$and':
[ { name: [Object] },
{},
{ '"date.start":{"$gte"': '2016-12-18T18:30:00.000Z',
'"date.end":{"$lt"': '2016-12-18T18:30:00.000Z' }
] }
在上面的对象中,我可以在date.start和date.end的开头和结尾看到 '
。而我只想要它,
{ '$and':
[ { name: [Object] },
{},
{ "date.start":{"$gte": '2016-12-18T18:30:00.000Z',
"date.end":{"$lt": '2016-12-18T18:30:00.000Z' }
] }
答案 0 :(得分:0)
您无法通过键定义值(嵌套对象),也无法使用键(即$gte
)部分定义对象,但没有值。
修复程序看起来像这样:
if (key === 'date.start:{$gte') {
obj['date.start'] = { '$gte' : null };
}
if (key === 'date.end:{$lt') {
obj['date.start'] = { '$lt' : null };
}
obj[key] = filter[1];
这假设null
将被替换为程序中其他位置的相应时间戳,然后您可以在发送查询之前将该对象序列化为字符串。
这些行存在许多问题:
if (key = 'date.start:{$gte') {
key = '"date.start":{"$gte"';
}
if (key = 'date.end:{$lt') {
key = '"date.end":{"$lt"';
}
key
,而不是进行比较。这将导致始终在if
块中执行代码,因为分配和返回的字符串始终是真的。obj[key] = filter[1]
分配给对象。由于赋值已经在if
语句执行时运行,因此它们没有机会影响赋值中使用的键。此外,这一行:
var key = `${filter[0]}`;
可以简化,因为它与:
相同var key = filter[0];
或者更好的let
和解构:
let [key] = filter;