使用$或$ 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
。