Mongodb 如何在单个查询中计算一对值

Mongodb 如何在单个查询中计算一对值,mongodb,Mongodb,我试图计算两个字段中成对值的出现次数。比如说, Field1 Field2 Value1 Value2 Value2 Value1 字段1和字段2中的值被视为一对-它们可以在两个字段之间互换。我下面的简单聚合查询将单向分组,并返回1作为计数。我想知道是否有可能使用一个查询对两种方式进行分组,并得到2作为计数。如果有任何反馈,我将不胜感激,谢谢 db.collection.aggregate([{$group:{_'id':{'f1':'$Field1','f2':'$Field2'}, 'co

我试图计算两个字段中成对值的出现次数。比如说,

Field1 Field2
Value1 Value2
Value2 Value1
字段1和字段2中的值被视为一对-它们可以在两个字段之间互换。我下面的简单聚合查询将单向分组,并返回1作为计数。我想知道是否有可能使用一个查询对两种方式进行分组,并得到2作为计数。如果有任何反馈,我将不胜感激,谢谢

db.collection.aggregate([{$group:{_'id':{'f1':'$Field1','f2':'$Field2'}, 'count':{$sum:1}}},{$sort:{'count':-1}}])

您可以在聚合管道中做很多练习,并实现您的目标,但我认为一个小的模式调整会更好。您应该以“排序顺序”存储
Field1
Field2
的值,其中
Field1
中的值较小,而
Field2
中的值较大。这样,在
(Field1,Field2)
上进行分组时,如果您不使用“排序顺序”并且认为字段是可互换的,则总是会将理想分组的所有文档分组在一起。如果它与用例的其他元素匹配,您还可以将
Field1
Field2
的值存储在一个数组中,因为由于多键语义,这是存储两个值的“最可互换的方式”。如果需要,可以使用在添加两个值时维护排序

{ "Field1" : "y", "Field2" : "x" }
===>
{ "Field1" : "x", "Field2" : "y" }
OR
{ "Field" : ["x", "y"] }

非常感谢。我最终按照你的建议更改了模式。对不起,我以前忘了好好谢谢你