TypeScript - 使用条件构建 Mongoose 查询
每个文档都有多个日期,我希望既能对其进行排序,也能进行过滤。日期过滤应根据输入的 sortBy 来应用。
这个有效
首先,我成功地添加了有条件的 .where:
// input examples
var fromUnixms, toUnixms; // some unix ms timestamps
var filters = ['createdAt', 'publishAt', 'publishFrom', 'publishTo'] // available date fields
var sortBy = 'createdAt'; // the field we want to sort on
// let's build a condition,
// looping through the sortable fields and filter based on what is sorted on
let query = model.find();
for (var i = 0; i < filters.length; i++) {
if (sortBy == filters[i].fieldName) {
query.where(filters[i].fieldName).gte(fromUnixms);
query.where(filters[i].fieldName).lte(toUnixms);
console.log("filtering on " + filters[i].fieldName
+ " between " + moment(fromUnixms)
+ " and " + moment(toUnixms);
}
}
}
query.sort(sortBy);
目标
现在行不通的是添加一个 .or(...)
查询应返回符合任一条件的文档
- 具有位于
fromUnixms-toUnixms时间段内的publishAt - 有一个持续时间
publishFrom-publishTo与持续时间fromUnixms-toUnixms重叠
我尝试过的
if (sortBy == filters[i].fieldName) {
query.or([
{
filters[i].fieldName: {
$gte: fromUnixms,
$lte: toUnixms
}
},
{
// overlapping duration operands would go here
}
]);
Typescript 不允许像这样在对象中使用动态键(上面的 filters[i].fieldName),会提示在点的地方期待一个 :。
提取到变量可以编译,但不会生效:Mongoose 可能会将其解释为我在寻找一个名为 "aFieldName" 的字段,而不是 "createdAt",也就是 sortBy 的值。
// ...
var aFieldName = filters[i].fieldName;
if (sortBy == filters[i].fieldName) {
query.or([
{
aFieldName: {
显然,胡子也不能编译,但这说明了我在这里想要实现的东西:
query.or([
{
{{ filters[i].fieldName }} : {