使用$或$ elemMatch和条件以外的数组

我的基本结构是我有一个会话对象的用户对象,其中包含一个subjectId和小时价格。

User{ defaultHourly: Number, subjects{ [ id: String, hourly: Number ] } } 

我使用elemMatch像这样:

 query.elemMatch("subjects", { "id": { $in: subjects }, "$or": [ { "hourly": { $eq: null } }, // this is my issue { "$and": [ { "hourly": { $ne: null } }, { "hourly": { $gte: price.low, $lte: price.high } } ] } ] }); 

elemMatch的第一部分确保我想要的subjectId在主题数组中。 然后我想按价格过滤。 如果用户在小时字段中为空,则我想将defaultHourly与price.low和price.high进行比较。

问题是defaultHourly不是主题领域,而是主题领域,所以我不知道如何访问它。

我想写:

 "$or": [ { "$and": [ { "hourly": { $eq: null } }, { "defaultHourly": { $gte: price.low, $lte: price.high } } //this doesnt work because default hourly is not a field. ] }, { "$and": [ { "hourly": { $ne: null } }, { "hourly": { $gte: price.low, $lte: price.high } } ] } ] }); 

我怎么能做这个多层次的比较?

您在$elemMatch之外编写条件,并将$or放在文档的顶层。 这允许每个“设置”条件适用:

 User.find({ "$or": [ { "defaultHourly": { "$gte": price.low, "$lte": price.high }, "subjects": { "$elemMatch": { "id": { "$in": subjects }, "hourly": { "$eq": null } } } }, { "subjects": { "$elemMatch": { "id": { "$in": subjects }, "hourly": { "$gte": price.low, "$lte": price.high } } } } ] }) 

还要注意$ne是不需要的,因为“范围”比较实际上会否定null因为它不会大于实际的数值。

另外请注意,所有MongoDB查询expression式都已经是AND条件,例如同一个属性上的$gte$lte 。 所以即使不需要, $ne也可以写成:

  "hourly": { "$gte": price.low, "$lte": price.high, "$ne": null } 

这删除了任何明确的$and