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:查找具有重复项的精确数组匹配的主要内容,如果未能解决你的问题,请参考以下文章