Javascript $和次$,在mongo和mongoose中未产生预期结果

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 }}, {"

我在mongo中遇到了一个看似简单的问题

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

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 }
                        ]}
                    ]})