在MongoDb中,嵌套数组内部的嵌套数组是否设计不好?我似乎找不到确切的答案。
我发现用于过滤和执行简单投影的C#文档相当不错,但是当我不得不“匹配”数组中投影中的深层嵌套数据时,我发现缺少它。实际上,使用Find似乎不可能,因为您不能在嵌套数组中使用ElemMatch。
我发现的解决方案是使用聚合查询。为此,我发现大多数有用(足够复杂)的示例都在stackoverflow上。不在MongoDb官方文档中。
示例:
db.nodes_boards.aggregate([
{"$match":{"_id": ObjectId("5d0bdf40e543b322e4209a68")}},
{"$unwind": "$RemoteBoard.apps"},
{"$match": {"RemoteBoard.apps.appname": "eACM", "RemoteBoard.apps.appid": "1f14f5c87731348438a57f6876fc2100"}},
{"$unwind": "$RemoteBoard.apps.objects"},
{"$match": {"RemoteBoard.apps.objects.name": "folder", "RemoteBoard.apps.objects.schemahash": "14d3100a042c21d6e8d2181c9ddee0e5"}},
{"$unwind": "$RemoteBoard.apps.objects.config_docs"},
{"$match": {"RemoteBoard.apps.objects.config_docs.config_doc.id": 5}},
{"$project": {"RemoteBoard.apps.objects.config_docs.config_doc.name": 1, "RemoteBoard.apps.objects.schema": 1, "ConnectionInfo.IPv4": 1, "ConnectionInfo.TCPPort": 1}}
])
用C#表示的同一管道:
var pipeline = new BsonDocument[]
{
new BsonDocument{ { "$match", new BsonDocument(
"_id", new ObjectId(id) )}
},
new BsonDocument{ { "$unwind", "$RemoteBoard.apps"} },
new BsonDocument{ { "$match", new BsonDocument{
{ "RemoteBoard.apps.appname", appname }, { "RemoteBoard.apps.appid", apphash } } }
},
new BsonDocument{ { "$unwind", "$RemoteBoard.apps.objects" } },
new BsonDocument{ { "$match", new BsonDocument{
{ "RemoteBoard.apps.objects.name", modelname }, { "RemoteBoard.apps.objects.schemahash", modelhash } } }
},
new BsonDocument{ { "$unwind", "$RemoteBoard.apps.objects.config_docs" } },
new BsonDocument{ { "$match", new BsonDocument{
{ "RemoteBoard.apps.objects.config_docs.config_doc.id", modelid } } }
},
new BsonDocument{ { "$project", new BsonDocument {
{ "RemoteBoard.apps.objects.config_docs.config_doc.name", 1 },
{ "RemoteBoard.apps.objects.schema", 1 },
{ "ConnectionInfo.IPv4", 1 },
{ "ConnectionInfo.TCPPort", 1 }
} } }
};
是否必须进行很多放松才能表明架构不好?
是否几乎完全依赖聚合查询来获取嵌套数据是否表明该架构是错误的?
是否有客观,简单的方法来衡量聚合查询的性能?