MongoDB 聚合查询添加到管道导致没有结果
MongoDB aggregate query adding to pipeline causing no results
我正在 运行通过 Py 聚合Mongo。
聚合的格式非常好,如下所示:
[{
$match: {
syscode: {
$in: [598.0]
},
date: {
$gte: newDate(1509487200000),
$lte: newDate(1510264800000)
}
}
},
{
$group: {
_id: {
date: "$date",
start_date: "$start_date",
end_date: "$end_date",
daypart: "$daypart",
network: "$network"
},
syscode_data: {
$push: {
syscode: "$syscode",
cpm: "$cpm"
}
}
}
}]
当我在 Python.
中对其光标使用 .explode 方法时,它 returns 没有结果
当我通过 MongoDB 的 NoSQL Booster 运行 它时,我得到了结果。也就是说,Mongo 日志文件与我 运行 通过 PyMongo.
时看到的内容没有变化
当我查看 Mongo 日志时,其中添加了一个额外的管道分组。显然 Booster 知道该怎么做而我不知道。
{ $group: { _id: null, count: { $sum: 1.0 } } }
这是我看到的完整日志行。
2018-03-11T21:05:04.374+0200 I COMMAND [conn71] command Customer.weird_stuff command: aggregate { aggregate: "rate_cards", pipeline: [ { $match: { syscode: { $in: [ 598.0 ] }, date: { $gte: new Date(1509487200000), $lte: new Date(1510264800000) } } }, { $group: { _id: { date: "$date", start_date: "$start_date", end_date: "$end_date", daypart: "$daypart", network: "$network" }, syscode_data: { $push: { syscode: "$syscode", cpm: "$cpm" } } } }, { $group: { _id: null, count: { $sum: 1.0 } } } ], cursor: { batchSize: 1000.0 }, $db: "Customer" } planSummary: COLLSCAN keysExamined:0 docsExamined:102900 cursorExhausted:1 numYields:803 nreturned:1 reslen:134 locks:{ Global: { acquireCount: { r: 1610 } }, Database: { acquireCount: { r: 805 } }, Collection: { acquireCount: { r: 805 } } } protocol:op_query 122ms
这是怎么回事?我如何从 Python 方面处理这个问题?
我在挖掘时的注意事项:这个管道 运行s 当我幸运地使用 Pymongo 的无序字典(默认)时。当我 运行 输入 JSON 通过 JSON.Jsondecoder 行时:
json.JSONDecoder(object_pairs_hook=OrderedDict).decode(parsed_param)
输出具有非常复杂的格式(由于管道需要维持其顺序,这是必需的)并最终传递了额外的部分。
因此,由于缺乏兴趣,我找到了解决方法。检查这个问题,我发现当我向管道 ({"$sort": {"_id": 1}})
添加一个额外的步骤时,从 Python 字典到 Mongo JSON 聚合的翻译没有生成额外的 JSON对象。
这是一个糟糕的答案,但我认为根本原因是在这个特定环境中复杂有序字典和 Mongo JSON 查询之间的转换有一个小错误影响了这个特定询问。
我很高兴能找到它并进一步检查它,但我被新工作埋没了。
我正在 运行通过 Py 聚合Mongo。
聚合的格式非常好,如下所示:
[{
$match: {
syscode: {
$in: [598.0]
},
date: {
$gte: newDate(1509487200000),
$lte: newDate(1510264800000)
}
}
},
{
$group: {
_id: {
date: "$date",
start_date: "$start_date",
end_date: "$end_date",
daypart: "$daypart",
network: "$network"
},
syscode_data: {
$push: {
syscode: "$syscode",
cpm: "$cpm"
}
}
}
}]
当我在 Python.
中对其光标使用 .explode 方法时,它 returns 没有结果当我通过 MongoDB 的 NoSQL Booster 运行 它时,我得到了结果。也就是说,Mongo 日志文件与我 运行 通过 PyMongo.
时看到的内容没有变化当我查看 Mongo 日志时,其中添加了一个额外的管道分组。显然 Booster 知道该怎么做而我不知道。
{ $group: { _id: null, count: { $sum: 1.0 } } }
这是我看到的完整日志行。
2018-03-11T21:05:04.374+0200 I COMMAND [conn71] command Customer.weird_stuff command: aggregate { aggregate: "rate_cards", pipeline: [ { $match: { syscode: { $in: [ 598.0 ] }, date: { $gte: new Date(1509487200000), $lte: new Date(1510264800000) } } }, { $group: { _id: { date: "$date", start_date: "$start_date", end_date: "$end_date", daypart: "$daypart", network: "$network" }, syscode_data: { $push: { syscode: "$syscode", cpm: "$cpm" } } } }, { $group: { _id: null, count: { $sum: 1.0 } } } ], cursor: { batchSize: 1000.0 }, $db: "Customer" } planSummary: COLLSCAN keysExamined:0 docsExamined:102900 cursorExhausted:1 numYields:803 nreturned:1 reslen:134 locks:{ Global: { acquireCount: { r: 1610 } }, Database: { acquireCount: { r: 805 } }, Collection: { acquireCount: { r: 805 } } } protocol:op_query 122ms
这是怎么回事?我如何从 Python 方面处理这个问题?
我在挖掘时的注意事项:这个管道 运行s 当我幸运地使用 Pymongo 的无序字典(默认)时。当我 运行 输入 JSON 通过 JSON.Jsondecoder 行时:
json.JSONDecoder(object_pairs_hook=OrderedDict).decode(parsed_param)
输出具有非常复杂的格式(由于管道需要维持其顺序,这是必需的)并最终传递了额外的部分。
因此,由于缺乏兴趣,我找到了解决方法。检查这个问题,我发现当我向管道 ({"$sort": {"_id": 1}})
添加一个额外的步骤时,从 Python 字典到 Mongo JSON 聚合的翻译没有生成额外的 JSON对象。
这是一个糟糕的答案,但我认为根本原因是在这个特定环境中复杂有序字典和 Mongo JSON 查询之间的转换有一个小错误影响了这个特定询问。
我很高兴能找到它并进一步检查它,但我被新工作埋没了。