我有以下两个项目插入到集合中“帧”:MongoDB的聚集与多个阵列
frame1 = {
"number": 1,
"hobjects": [ { "htype": 1, "weight": 50 },
{ "htype": 2, "weight": 220 },
{ "htype": 2, "weight": 290 },
{ "htype": 3, "weight": 450 } ],
"sobjects": [ { "stype": 1, "size": 10.0 },
{ "stype": 2, "size": 5.1 },
{ "stype": 2, "size": 6.5 } ],
}
frame2 = {
"number": 2,
"hobjects": [ { "htype": 1, "weight": 61 },
{ "htype": 2, "weight": 210 },
{ "htype": 2, "weight": 250 } ],
"sobjects": [ { "stype": 1, "size": 12.1 },
{ "stype": 2, "size": 4.9 },
{ "stype": 2, "size": 6.2 },
{ "stype": 2, "size": 5.7 } ],
}
frames.insert(frame1)
frames.insert(frame2)
现在我想要做在部分帧数据的查询:
query = { "hobjects.htype": 3, "sobjects.stype": 2 }
db.frames.find(query)
其结果在:
{u'_id': ObjectId('545b6ea7b9ad9a03462d743b'), u'hobjects': [{u'htype': 1, u'weight': 50}, {u'htype': 2, u'weight': 220}, {u'htype': 2, u'weight': 290}, {u'htype': 3, u'weight': 450}], u'number': 1, u'sobjects': [{u'stype': 1, u'size': 10.0}, {u'stype': 2, u'size': 5.1}, {u'stype': 2, u'size': 6.5}]}
而不是我真正想要的。我想有收集过滤,根据查询,使我得到以下的结果,而不是:
{u'_id': ObjectId('545b6ea7b9ad9a03462d743b'), u'hobjects': [{u'htype': 3, u'weight': 450}], u'number': 1, u'sobjects': [{u'stype': 2, u'size': 5.1}, {u'stype': 2, u'size': 6.5}]}
我发现的唯一的解决方案涉及平仓聚集和集合分组:
query = { "hobjects.htype": 3, "sobjects.stype": 2 }
db.frames.aggregate([
{ "$match": query },
{ "$unwind": "$hobjects" },
{ "$match": dict((key, value) for key, value in query.iteritems() if "hobjects." in key) },
{ "$group": { "_id": "$_id", "number": { "$first": "$number" } , "hobjects": { "$push": "$hobjects" }, "sobjects": { "$first": "$sobjects" } } },
{ "$unwind": "$sobjects" },
{ "$match": dict((key, value) for key, value in query.iteritems() if "sobjects." in key) },
{ "$group": { "_id": "$_id", "number": { "$first": "$number" } , "hobjects": { "$first": "$hobjects" }, "sobjects": { "$push": "$sobjects" } } },
])
我想这就是不是一种非常有效和灵活的查询方式。我想知道是否还有其他选择?
谢谢@NeilLunn!看起来像是一个最佳选择。会试试看! – 2014-11-06 14:12:52
测试了解决方案,它适用于我的示例。尽管我更喜欢用对整个对象数据进行任意查询的更一般的解决方案。 – 2014-11-07 14:41:22
@Neil Lunn - 你可以请帮忙写这个查询在java驱动程序。谢谢 – PVH 2015-03-19 05:20:07