MongoDB在同一个字段上的两个或多个$ match比较不起作用

时间:2017-04-18 09:02:20

标签: mongodb mongodb-query

这有效:

    $match: {
        $and: 
        [{ 
            status: {$lt: 4},       
            checkin: {$gte: 1490720400, $lte: 1490806799} 
        }]
    }

这不是:

    $match: {
        $and: 
        [{ 
            status: {$lt: 4},       
            checkin: {$gte: 1490720400},
            checkin: {$lte: 1490806799}
        }]
    }

为什么?

在第二个例子中,它完全忽略了第二个比较。

如果是这样,那么这个会发生什么?

    $match:
    { 
        $and: 
        [
            { checkin: {$gte: 1490979600}, checkout: {$lte: 1493569439} },
            { checkin: {$lt:  1490979600}, checkout: {$gt:  1493569439} },
            { checkin: {$lt:  1490979600}, checkout: {$gt:  1490979600} },
            { checkin: {$lt:  1493569439}, checkout: {$gt:  1493569439} }
        ]
    }

那会是一样的吗?它看第一个并忽略了接下来的三个?

有没有办法避免这种情况?

2 个答案:

答案 0 :(得分:2)

鉴于Ex:1

$match: {
        $and: 
        [{ 
            status: {$lt: 4},       
            checkin: {$gte: 1490720400, $lte: 1490806799} 
        }]
    }

在这个例子中,字段名称没有歧义,所以工作正常

鉴于Ex:2

$match: {
        $and: 
        [{ 
            status: {$lt: 4},       
            checkin: {$gte: 1490720400},
            checkin: {$lte: 1490806799}
        }]
    }

这里有一个模糊的归档" checkin"所以," checkin"将被下一个" checkin"覆盖在构造对象时(取决于哪一个将被覆盖,通常首先将被第二个替换)

要使其正常工作,您需要使用如下所示

$match:
        { 
            $and: 
            [
             {status: {$lt: 4}},       
             {checkin: {$gte: 1493569438} },
             {checkin: {$lte: 1493569440}}
           ]
        }
    }

或者您可以在给出Ex:1

中使用

鉴于Ex:3

$match:
    { 
        $and: 
        [
            { checkin: {$gte: 1490979600}, checkout: {$lte: 1493569439} },
            { checkin: {$lt:  1490979600}, checkout: {$gt:  1493569439} },
            { checkin: {$lt:  1490979600}, checkout: {$gt:  1490979600} },
            { checkin: {$lt:  1493569439}, checkout: {$gt:  1493569439} }
        ]
    }

将正常工作,即它将检查$和

中的所有4个条件

答案 1 :(得分:1)

{ 
    status: {$lt: 4},       
    checkin: {$gte: 1490720400},
    checkin: {$lte: 1490806799}
}

是JSON文档的错误语法。字段名称应该是唯一的。您声明checkin两次,这使得它不明确,并且由解析器决定如何解决它。例如。在mongodb shell中,后面的值会覆盖前者:

printjson({ 
    status: {$lt: 4},       
    checkin: {$gte: 1490720400},
    checkin: {$lte: 1490806799}
});

的结果

{
    "status" : {
        "$lt" : 4
    },
    "checkin" : {
        "$lte" : 1490806799
    }
}