mongodb“ $ gte”和“ $ lte”不能正常工作

时间:2018-08-30 12:47:30

标签: mongodb

当我用“ $ gte”和“ $ lte”查询数据库时,返回了一些不匹配的数据,这让我很困惑。请帮助我~~~谢谢!!!

我期望的登录时间数据在1535527571405和1535527571405之间 但是结果不一致

这是我的mongodb脚本和搜索结果:

db.getCollection("userLog").find({ "loginlogs.loginTime" : {"$gte" : 1535527571405, "$lte" : 1535527571420}}, {'loginlogs.loginTime': 1})

result.png

em〜我的数据库版本是v.3.3.11

2 个答案:

答案 0 :(得分:0)

看到结果,loginLogs.loginTime是一个数组,因此您的查询将返回所有userLog,在loginLogs数组中具有相应的loginTime值。 为了满足您的需求,您可以使用聚合框架:

数据集:

{ 
    "_id" : ObjectId("5b87f33d9dc5882db7dd81fa"), 
    "loginLogs" : [
        {
            "loginTime" : 152.0
        }, 
        {
            "loginTime" : 167.0
        }, 
        {
            "loginTime" : 183.0
        }, 
        {
            "loginTime" : 192.0
        }, 
        {
            "loginTime" : 202.0
        }
    ]
}
{ 
    "_id" : ObjectId("5b87f3519dc5882db7dd81fb"), 
    "loginLogs" : [
        {
            "loginTime" : 154.0
        }, 
        {
            "loginTime" : 161.0
        }, 
        {
            "loginTime" : 178.0
        }, 
        {
            "loginTime" : 194.0
        }, 
        {
            "loginTime" : 198.0
        }
    ]
}

查询:

db.logs.aggregate(
    [
        {
            $unwind: {
                path : "$loginLogs",

            }
        },
        {
            $match: {
            "loginLogs.loginTime":{$gte:170,$lt:195}
            }
        },
        {
            $group: {
            _id:"$_id",
            loginLogs:{$push:"$loginLogs.loginTime"}
            }
        },
    ],
);

将输出:

{ 
    "_id" : ObjectId("5b87f3519dc5882db7dd81fb"), 
    "loginLogs" : [
        178.0, 
        194.0
    ]
}
{ 
    "_id" : ObjectId("5b87f33d9dc5882db7dd81fa"), 
    "loginLogs" : [
        183.0, 
        192.0
    ]
}

答案 1 :(得分:0)

您可能更喜欢使用聚合的过滤器阶段 https://docs.mongodb.com/manual/reference/operator/aggregation/filter/