Mongodb:根据字段值获取常用文档的计数

Mongodb:根据字段值获取常用文档的计数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,假设我有一个文档集合,类似这样: { "itemName":"Burger", "userId":"25286", "location":{ "locationTitle":"Burger king,Delhi" } } { "itemName":"Burger", "userId":"25287", "location":{ "locationTitle":"Burger king,Delhi" } } 我必须找到两个用户之间的共同项目。如果字段ite

假设我有一个文档集合,类似这样:

{
"itemName":"Burger",
"userId":"25286",
"location":{
       "locationTitle":"Burger king,Delhi"
   }
}

{
"itemName":"Burger",
"userId":"25287",
"location":{
       "locationTitle":"Burger king,Delhi"
  }
}
我必须找到两个用户之间的共同项目。如果字段itemNamelocationTitle中的一个具有相同的字段值,则项目将是公共的。但一个用户可以有多个同名项目


谢谢

您可以使用聚合将常用项分组在一起。如果条目具有相同的itemName或locationTitle,则下面的两个查询将对它们进行分组,并将userid添加到用户数组中。users数组将不包含重复项,因此,它考虑了一个要求,即如果同一条目出现多次,则不应添加两次userId

db.items.aggregate({
  $group: {
    _id: "$itemName",
    users: {
      $addToSet: "$userId"
    },
    count: {
      $sum: 1
    }
  }
});

db.items.aggregate({
  $group: {
    _id: "$location.locationTitle",
    users: {
      $addToSet: "$userId"
    },
    count: {
      $sum: 1
    }
  }
});

如果我将第一个文档的itemName更新为“pizza”,它将不起作用,它将给我结果me{“_id”:“Burger”,“users”:[“25287”],“count”:1}{“_id”:“pizza”,“users”:[“25286”],“count”:1},但它应该是公共的,因为两个文档中的值位置相同,一个将对itemName进行计数,另一个将对locationTitle进行计数。我不确定是否有一个查询可以同时完成这两个任务。让我检查一下,如果两个用户的itemName和locationTitle都匹配,会发生什么情况?首先感谢您的努力。简单地说,它将被视为共同的项目,并请考虑一个更多的情况下,有一个用户可以上传项目多次相同的项目名称或位置标题。我认为没有办法做到这一点在一个单一的查询在MangGDB。您必须在程序中分别运行这两个查询,然后将两个查询的结果聚合在一起