$和sub $,而不会产生mongo和mongoose的预期结果

modelThreader.find({ $and: [ {"date_entered": { $lt: fromTime }}, {"cancelled": { $ne: true }}, {"hideFromUserIds.id": { $ne: current_user_id }}, {"banned": false}, {$and: [ {"user_id": { $ne: current_user_id }}, {"privacy": { $ne: 1 }} ]} ] }).exec(function( err, docs ){ // handle response. }); 

我在mongo中遇到了一个看似简单的查询的麻烦。

上面的查询我需要在查询中设置所有的第一批,即:

 {"date_entered": { $lt: fromTime }}, {"cancelled": { $ne: true }}, {"hideFromUserIds.id": { $ne: current_user_id }}, {"banned": false}, 

按预期,这工作正常。 但是,我需要添加到这个查询文档模式已经改变。

有一个新的领域“隐私”,其中int 1是私人的,只应该返回给所有人的用户。 正如你从我的查询中可以看到的,我想说

 {$and: [ {"user_id": { $ne: current_user_id }}, {"privacy": { $ne: 1 }} ]} 

即如果current_user_id是请求查询的请求,则不应用任何隐私filter,否则只返回隐私文档不是1。

问题是,它正在应用$ ne:1的所有用户,包括current_user_id …

编辑唯一的方法,我可以实现预期的结果是做一个巨大的$或但这感觉效率低下:

其中或者是其他user_id的数组

 $or: [ {$and: [ //other people, respecting privacy {$or: or}, {"date_entered": { $lt: fromTime }}, {"cancelled": { $ne: true }}, {"hideFromUserIds.id": { $ne: current_user_id }}, {"banned": false}, {"user_id": { $ne: current_user_id }}, {"privacy": { $ne: 1 }} ]}, {$and: [ //this user, not looking at privacy {"date_entered": { $lt: fromTime }}, {"cancelled": { $ne: true }}, {"hideFromUserIds.id": { $ne: current_user_id }}, {"banned": false}, {"user_id": current_user_id } ]} ]}) 

你似乎错过了这里明显的复合逻辑,其中只有一小部分是等价的$or条件:

 modelThreader.find({ "date_entered": { "$lt": fromTime }, "cancelled": { "$ne": true }, "banned": false, "$or": [ { "user_id": current_user_id }, { "user_id": { "$ne": current_user_id }, "hideFromUserIds.id": { "$ne": current_user_id }, "privacy": { "$ne": 1 } ] }) 

在逻辑中的其他“调整”的地方是, "hideFromUserIds.id"current_user_id "hideFromUserIds.id" ,与"user_id"匹配,因为它已经是它们了。

除非明确指出,否则所有的 MongoDB查询条件都是“已经”是“AND”条件。 因此,除了在$orexpression式“内”应用的参数之外,任何坐在“ $or ”之外的“ $or被认为是“AND”expression式。

因此, $or内的唯一的东西是在逻辑分解中适用于“其他用户”的那些条件。 否则,其他所有情况在所有情况下均作为“AND”应用。

最后你混淆了这些条款。 因为当你的结果意味着你想要除了这些条件之外的其他结果” ,那么你实际上是指$or