MongoDB筛选器查询不使用';我不能返回我想要的结果

MongoDB筛选器查询不使用';我不能返回我想要的结果,mongodb,mongodb-query,Mongodb,Mongodb Query,我对一个简单的MongoDB查询感到困惑,我无法找出问题所在。我有这样的收藏: { "_id" : NumberLong(1939026454), "username" : "5144269288", "_type" : 1, "group_id" : 416, "user_id" : NumberLong(426661), "credit_used" : 0.0, "retry_count" : 1, "successful" : true, "type_details" : { "i

我对一个简单的MongoDB查询感到困惑,我无法找出问题所在。我有这样的收藏:

{
"_id" : NumberLong(1939026454),
"username" : "5144269288",
"_type" : 1,
"group_id" : 416,
"user_id" : NumberLong(426661),
"credit_used" : 0.0,
"retry_count" : 1,
"successful" : true,
"type_details" : {
    "in_bytes" : 0,
    "sub_service_qos" : "",
    "sub_service_name" : "rating-group-103",
    "out_bytes" : 0,
    "sub_service_charging" : "FreeIPTV",
    "remote_ip" : ""
},
"logout_time" : ISODate("2017-11-06T07:16:09.000Z"),
"before_credit" : 4560.2962,
"ras_id" : 18,
"caller_id" : "",
"isp_id" : 0,
"duration" : NumberLong(14500),
"details" : {
    "connect_info" : "rate-group=103",
    "sub_service" : "rating-group-103",
    "diameter_request_type" : "initial"
},
"unique_id_value" : "918098048;falcon;Dehghan01000000001415716f9a113697;529;falcon-02b4e8a7__103",
"charge_rule_details" : [ 
    {
        "start_in_bytes" : 0,
        "charge_rule_id" : 3682,
        "start_out_bytes" : 0,
        "stop_time" : ISODate("2017-11-06T07:16:09.000Z"),
        "stop_out_bytes" : 0,
        "start_time" : ISODate("2017-11-06T03:14:29.000Z"),
        "charge_rule_desc" : "rating-group-103",
        "stop_in_bytes" : 0
    }
],
"unique_id" : "acct_session_id",
"login_time" : ISODate("2017-11-06T03:14:29.000Z")
}
我需要筛选
login\u time
在两个给定日期之间并且
键入\u详细信息的文档。sub\u service\u name
是一些字符串

我试过这个:

db.getCollection('connection_log_partial_data').find({
"type_details" : {"sub_service_name": "rating-group-103"},
"login_time": {
    "$gt": ISODate("2016-11-06T03:14:29.000Z"),
    "$lt": ISODate("2017-11-06T03:14:29.000Z")
}
});

但它获取
0
记录。有什么建议吗?

您的查询应该是:

db.getCollection('connection_log_partial_data').find({
"type_details.sub_service_name" : "rating-group-103",
"login_time": {
    "$gte": ISODate("2016-11-06T03:14:29.000Z"),
    "$lte": ISODate("2017-11-06T03:14:29.000Z")
}
});

您是否尝试过
$gte
$lte
?您只检查
小于
大于
,并且您使用的值相等。如果您使用
$lte
$gte
进行“纠正”,您确实意识到您要求的是1秒事件的“范围”。通常,我们提供一个
日期
对象,用于更广泛的选择。通常,您不会提供“相同的值”。这才是你真正的问题。@Elmer Dantas我试过了,但实际上问题出在
type\u details
上。当我从过滤器中删除它时,结果会显示出来。但我相信在我的数据中有这样的记录!这里我们谈论的是数十亿张唱片。@Neil Lunn,这是一个1年的范围。它有效!我想知道为什么mongo不明白?这是一个不同的表达方式吗<代码>“类型详细信息”:{“子服务组名称”:“rating-group-103”}vs
“类型详细信息.子服务组名称”:“rating-group-103”
这是mongoDB sintaxe。您需要使用对象属性来创建过滤器。由于
type\u details
是一个子文档,您只需要使用它的属性(
sub\u service\u name
)BSON(JSON)表示法,非常简单..ahn?您使用的方式更可能与
$elemMatch
sintaxe一起使用……但由于您只有一个查询,文档表示在这些情况下不需要使用
$elemMatch