我正在尝试计算两个字段中对的值的出现次数。例如,
Field1 Field2
Value1 Value2
Value2 Value1
Field1和Field2中的值被认为是一对 - 它们可以在两个字段之间互换。我在下面的简单聚合查询分组一种方式,并返回1作为计数。我想知道是否可以使用单个查询对两种方式进行分组并获得2次计数。我将不胜感激任何反馈,谢谢。
db.collection.aggregate([{$group:{_'id':{'f1':'$Field1','f2':'$Field2'}, 'count':{$sum:1}}},{$sort:{'count':-1}}])
答案 0 :(得分:0)
你可以在聚合管道中做很多体操并完成你的目标,但我认为一个小的架构调整更好。您应该将Field1
和Field2
的值存储在"排序顺序"中,Field1
中的值越小,Field2
中的值越大。这样,如果您没有使用"排序顺序"那么,(Field1, Field2)
上的分组将始终将所有理想分组的文档组合在一起。并认为这些领域是可以互换的。如果它与您的用例的其他元素匹配,您还可以将Field1
和Field2
的值存储在数组中,因为这是"最可互换的方式"由于多键语义而存储两个值。如果需要,可以在添加两个值时使用$sort
来维护排序。
{ "Field1" : "y", "Field2" : "x" }
===>
{ "Field1" : "x", "Field2" : "y" }
OR
{ "Field" : ["x", "y"] }