我有一个集合测试,它有以下的值,我必须根据 "值 "字段得到文档,我可以很容易地从下面给出的查询中得到。
db.getCollection('test').find({"value" : 100})
但真正的问题是,我有一个 "值 "字段的列表,如[100,104,200152,......]这个列表可以是非常长的,我希望我的结果在下面给定的格式,以减少Mongo查询的数量,因为这是花费太多的时间,如果列表中包含的 "值 "是太大,那么我必须预先执行多个Mongo查询,以获取所有的记录。
{100:[
/* 1 */
{
"_id" : "C1",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 2 */
{
"_id" : "C2",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 3 */
{
"_id" : "C3",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 4 */
{
"_id" : "C4",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 5 */
{
"_id" : "CO",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 6 */
{
"_id" : "DD",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 7 */
{
"_id" : "EX",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}],
104:
[{
"_id" : "AU",
"value" : 104,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}],
200152:
[
{
"_id" : "GenFile",
"value" : 200152,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
]
数据库
/* 1 */
{
"_id" : "AU",
"value" : 104,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 2 */
{
"_id" : "C1",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 3 */
{
"_id" : "C2",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 4 */
{
"_id" : "C3",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 5 */
{
"_id" : "C4",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 6 */
{
"_id" : "CO",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 7 */
{
"_id" : "DD",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 8 */
{
"_id" : "EX",
"value" : 100,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 9 */
{
"_id" : "GS_SEG",
"value" : 124755350,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
/* 10 */
{
"_id" : "GenFile",
"value" : 200152,
"lastUpdatedTime" : ISODate("2019-11-04T00:00:00.000Z"),
"timetaken" : 3.0
}
你可以使用下面的聚合来为你做这些工作。但是,它将有值字段 100
,104
作为字符串而不是数字(我不得不用 toString
操作符,否则我会收到错误信息)。)
db.collection.aggregate([
{
$group: {
_id: "$value",
root: {
$push: "$$ROOT"
}
}
},
{
$project: {
k: {
$toString: "$_id"
},
v: "$root",
_id: 0
}
},
{
$group: {
_id: null,
x: {
$push: "$$ROOT"
}
}
},
{
$project: {
_id: 0,
x: {
$arrayToObject: "$x"
}
}
},
{
$replaceRoot: {
newRoot: "$x"
}
}
])
以下将是输出。
[
{
"1.24755e+08": [
{
"_id": "GS_SEG",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 1.2475535e+08
}
],
"100": [
{
"_id": "C1",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 100
},
{
"_id": "C2",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 100
},
{
"_id": "C3",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 100
},
{
"_id": "C4",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 100
},
{
"_id": "CO",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 100
},
{
"_id": "DD",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 100
},
{
"_id": "EX",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 100
}
],
"104": [
{
"_id": "AU",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 104
}
],
"200152": [
{
"_id": "GenFile",
"lastUpdatedTime": ISODate("2019-11-04T00:00:00Z"),
"timetaken": 3,
"value": 200152
}
]
}
]
你搜索的方向是对的, 你要防止你的代码把大部分时间花在网络请求上. pymongo的 $in
操作符选择字段值等于指定数组中任何值的文档。
在您的案例中,它看起来像这样。
# Set or build a list of the values
list_with_values = [100, 104, 200152]
# Make one call to the DB, asking for all of the matching records.
result = db.getCollection('test').find({"value" : {"$in": list_with_values})
进一步参考如何使用 $in
操作符的工作原理。http:/docs.mongodb.orgmanualreferenceoperatorqueryin