Mongoose:按数学排序并按字符串数组中的多个值进行搜索

时间:2012-10-03 07:24:46

标签: node.js mongodb mongoose

你好SO用户,

我遇到了一些高级的Mongoose查询,我根本无法从文档中找到答案。

首先,我想按一些数学排序。 基本上我希望能够按两个对象的价格差异进行排序。 我有“价格”和“oldprice”,其中包含基本数字值。 然后我想减去它们并按最高折扣排序。 所以在SQL中我会像

ORDER BY (oldprice - price)

我遇到的另一个问题是通过字符串数组过滤字符串数组。

所以基本上我有一个“裤子”模型,有一个[size]对象(字符串数组),它包含多个大小。 现在我希望能够通过多个用户选择的尺寸搜索数据库,并找到包含 ONE 所选尺寸的所有裤子。

我尝试过:

Pants.find({
  name: new RegExp(search, 'ig'),
  sizes: {
    $in: [selectedSizes]
  }
}).skip(skip).limit(limit).sort(sort).execFind(function(err, pants) {
  return res.send(pants);
});

如果一个值在“selectedSizes”中,但是有多个值失败,那么它可以正常工作。

希望有人有一些想法; - )


裤子型号:

var PantsSchema;
PantsSchema = new mongoose.Schema({
  supplier: {
    type: String
  },
  manufacturer: {
    type: String
  },
  web: {
    type: String
  },
  name: {
    type: String
  },
  link: {
    type: String,
    required: true,
    unique: true
  },
  image: {
    type: String
  },
  sizes: {
    type: [String]
  },
  price: {
    type: Number
  },
  oldprice: {
    type: Number
  },
  added: {
    type: Date,
    "default": Date.now
  },
  updated: {
    type: Date
  }
});

1 个答案:

答案 0 :(得分:1)

对于有问题的订单,您需要在Mongo中创建一个存储oldPrice - price值的字段,因为您只能按字段排序(并且您要对此进行索引)字段)。

然后,您只需在sort电话中添加mongoose表达式:

.sort('priceDifference', 1);  // 1 or -1 depending on ascending or descending

对于第二个问题,您需要创建$or个表达式,每个表达式对应您要查找的每个大小。我认为它看起来像这样:

.find( { $or : [ { sizes : { $in: ['m'] } }, { sizes : {$in: ['l'] } } ] } )