MongoDB 对某列去重后,查询该列对应的另外一值是否都为 xx

2020-10-28 22:38:00 +08:00
 Te11UA

数据形如

[
{'status':'ok','message_id': '1', 'group_id':1},
{'status':'bad','message_id': '2', 'group_id':1},
{'status':'ok','message_id': '1', 'group_id':2}
],

需求是要判断当前库中同一 group 的 status 都为 ok,有一个 bad 则返回 False 。由于不太熟悉 MongoDB,使用了比较难看的做法:

group_ids = db.tasks.distinct('group_id')
for group_id in group_ids:
____status = db.tasks.find_one({'group_id': group_id, 'status': 'bad'})
____return False if task else True

请问大佬们,有什么好的办法可以完成这个需求呢

3286 次点击
所在节点    MongoDB
3 条回复
catinsides
2020-10-28 22:57:17 +08:00
```
aggregate([
{
$group: {
_id: '$group_id',
statusAry: {
$addToSet: '$status'
}
}
},
{
$addFields: {
len: {
$size: '$statusAry'
}
}
},
{
$addFields: {
results: {
$cond: { if: { $eq: [ "$len", 1 ] }, then: true, else: false }
}
}
}
])
```
catinsides
2020-10-28 22:59:31 +08:00
没判断全是 bad
lithiumii
2020-10-28 23:02:10 +08:00
你这个是 pymongo ?如果可以在 py 里做的话

group_ids = db.tasks.distinct('group_id')
bad_ids = db.tasks.find({'status':'bad'}).distinct('group_id')
good_ids = [x for x in group_ids if x not in bad_ids]

或者用 MongoDB 的 aggregation

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/719603

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX