MongoDb:查找具有重复项的精确数组匹配

Posted

技术标签:

【中文标题】MongoDb:查找具有重复项的精确数组匹配【英文标题】:MongoDb: Find exact array match with duplicates 【发布时间】:2020-11-27 15:27:32 【问题描述】:

我正在尝试编写一个 mongoDB 查询来查找与给定示例匹配的文档:

我有用户集合


  "userId": "1",
  "visitedPlaces": [
    
      "city": "Kair",
      "country": "Egypt"
    ,
    
      "city": "Paris",
      "country": "France"
    ,
    
      "city": "Kair",
      "country": "Egypt"
    ,

  ]
,


  "userId": "2",
  "visitedPlaces": [
    
      "city": "Kair",
      "country": "Egypt"
    ,
    
      "city": "Paris",
      "country": "France"
    ,
    
      "city": "Paris",
      "country": "France"
    
  ]

我想编写一个查询,返回访问“Kair”两次和访问“Paris”一次的用户(用户“2”不匹配这种情况)

我尝试过类似的查询

.find("visitedPlaces.city":  "$all": ["Kair", "Paris", "Kair"] , "visitedPlaces":  "$size": 3   )

但它会返回两个用户。

有没有办法在 mongo 中编写这样的查询?

【问题讨论】:

【参考方案1】:

这个呢

db.getCollection('vists').aggregate([
  '$addFields': 
    'countVisitedPlaces': 
      '$map': 
        'input':  '$setUnion': ['$visitedPlaces.city'],
        'as': 'city',
        'in': 
          'city': '$$city',
          'noOfTimeCityVists': 
            '$size': 
              '$filter': 
                'input': '$visitedPlaces',
                'as': 'visitedCity',
                'cond':  '$eq': ['$$visitedCity.city', '$$city'] 
            
          
        
      
    
  
,
// here you got city wise visits count
 
 $match:  
  $and: [
   'countVisitedPlaces': 
     '$elemMatch': 'noOfTimeCityVists': 2, 'city': 'Kair' 
   ,
   
    'countVisitedPlaces': 
     '$elemMatch': 'noOfTimeCityVists': 1, 'city': 'Paris' 
   
  ]
])

您为不同的搜索和结果更改管道的最后阶段。

【讨论】:

这里没有看到实际的搜索条件。【参考方案2】:

检查以下查询。您只需要根据您的情况修改$match即可。

db.collection.aggregate(
  "$unwind": "$visitedPlaces"
,

  "$group": 
    "_id": 
      "userId": "$userId",
      "city": "$visitedPlaces.city"
    ,
    "count": 
      "$sum": 1
    
  
,

  "$project": 
    "userId": "$_id.userId",
    "cityCount": 
      "city": "$_id.city",
      "count": "$count"
    ,
    "_id": 0
  
,

  "$group": 
    "_id": "$userId",
    "cityCount": 
      "$push": "$cityCount"
    
  
,

  "$match": 
    "cityCount": 
      "$all": [
        
          "$elemMatch": 
            "city": "Kair",
            "count": 2
          
        ,
        
          "$elemMatch": 
            "city": "Paris",
            "count": 1
          
        
      ]
    
  
,

  "$project": 
    "userId": "$_id",
    "_id": 0
  
)

这里是MongoPlayground。

【讨论】:

以上是关于MongoDb:查找具有重复项的精确数组匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中保留重复项的同时进行递归查找

如何在 MongoDB 中查找具有特殊字符的数据

Mongodb数组查询:查找数组中包含局外人的记录[重复]

javascript 在对象数组中查找搜索项的匹配项

如何在 MongoDB 中推入具有精确键值的对象嵌套数组?

Excel:在多列中查找具有重复项的多个值