$和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”条件。 因此,除了在$or
expression式“内”应用的参数之外,任何坐在“ $or
”之外的“ $or
被认为是“AND”expression式。
因此, $or
内的唯一的东西是在逻辑分解中适用于“其他用户”的那些条件。 否则,其他所有情况在所有情况下均作为“AND”应用。
最后你混淆了这些条款。 因为当你的结果意味着你想要“ 除了这些条件之外的其他结果” ,那么你实际上是指$or