Javascript $和次$,在mongo和mongoose中未产生预期结果
我在mongo中遇到了一个看似简单的问题 上面的查询我需要所有的第一批都在查询ie中设置:Javascript $和次$,在mongo和mongoose中未产生预期结果,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,我在mongo中遇到了一个看似简单的问题 上面的查询我需要所有的第一批都在查询ie中设置: modelThreader.find({ $and: [ {"date_entered": { $lt: fromTime }}, {"cancelled": { $ne: true }}, {"hideFromUserIds.id": { $ne: current_user_id }}, {"
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.
});
正如预期的那样,这很好。但是,我需要添加到此查询,因为文档模式已更改
有一个新字段“privacy”,其中int 1是私有的,应该只向用户返回给所有人。正如你从我的提问中所看到的,我想说
{"date_entered": { $lt: fromTime }},
{"cancelled": { $ne: true }},
{"hideFromUserIds.id": { $ne: current_user_id }},
{"banned": false},
即,如果当前用户id是请求查询的用户,则不要应用任何隐私过滤器,否则,仅返回具有隐私的文档不是1
问题是它正在将$ne:1应用于所有用户,包括当前用户id
编辑
我能达到预期效果的唯一方法是做一个巨大的$or,但这感觉效率低下:
其中或是其他用户id的数组
{$and: [
{"user_id": { $ne: current_user_id }},
{"privacy": { $ne: 1 }}
]}
您似乎忽略了明显的复合逻辑,其中只有“一小部分”是等效条件:
modelThreader.find({
“输入日期”:{“$lt”:fromTime},
“已取消”:{“$ne”:true},
“禁止”:错误,
“$or”:[
{“用户id”:当前用户id},
{
“用户id”:{“$ne”:当前用户id},
“hideFromUserIds.id”:{“$ne”:当前用户id},
“隐私”:{“$ne”:1}
]
})
逻辑中的另一个“调整”是“hideFromUserId.id”
对于当前用户id
来说与“用户id”
匹配并不重要,因为它已经是它们
所有MongoDB查询条件都是“已经”和“条件,除非另有明确说明。因此,位于“外部”的任何内容都被视为表达式中“应用的参数之外”的“和”表达式
因此,内部的唯一内容是那些在逻辑分解中适用于“其他用户”的条件。否则,其他所有内容在所有情况下都作为“AND”应用
最后,你混淆了术语。因为当你的结果意味着你想在其他结果中添加这些条件中的一个时,你实际上是指
$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 }
]}
]})