鉴于数据:
"tools": {
"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final"
},
我想提供参数 _id使查询返回参数 groups 数组内的所有组>表。
直截了当的解决方案似乎在PyMongo中进行了几次数据库调用:
但是这会有太多不必要的开销。我觉得必须有更好,更快的方法在MongoDB中执行此操作(不在DB中运行自定义JS)。或者我应该通过将其归一化(如关系表)重新构建我的数据,忽略基于文档的方法?
再次,请帮我找到一个可以在PyMongo数据库界面中使用的解决方案
答案 0 :(得分:6)
您可以使用聚合框架在单个查询中执行此操作。特别是,您需要运行使用 $lookup
运算符的聚合管道,以便从parameters
集合到groups
集合进行左连接。< / p>
考虑运行以下管道:
db.parameters.aggregate([
{ "$unwind": "$groups" },
{
"$lookup": {
"from": "groups",
"localField": "groups",
"foreignField": "_id",
"as": "grp"
}
},
{ "$unwind": "$grp" }
])
示例输出
/* 1 */
{
"_id" : ObjectId("56cac0cd0b5a1ffab1bd6c12"),
"name" : "Speed",
"groups" : "123",
"grp" : {
"_id" : "123",
"name" : "Group01"
}
}
/* 2 */
{
"_id" : ObjectId("56cac0cd0b5a1ffab1bd6c12"),
"name" : "Speed",
"groups" : "234",
"grp" : {
"_id" : "234",
"name" : "Group02"
}
}
如果您的MongoDB服务器版本不支持 $lookup
管道运算符,那么您需要执行以下两个查询:
# get the group ids
ids = db.parameters.find_one({ "_id": ObjectId("56cac0cd0b5a1ffab1bd6c12") })["groups"]
# query the groups collection with the ids from previous query
db.groups.find({ "_id": { "$in": ids } })
编辑:将聚合查询中的字段名称与示例数据集中的字段名称匹配(在问题内)