MongoDB技术问询:如何检索votes数组多字段匹配的文档
匹配MongoDB数组中多字段元素的查询方案(对比两位议员投票记录)
嘿,我来帮你搞定这个MongoDB查询问题!你需要从包含votes数组的投票文档里,筛选出同时存在两位特定议员投票记录的条目对吧?下面直接给你实用的解决方案:
核心查询逻辑
我们要找的是同一次投票文档中,既包含第一位议员的指定投票字段(比如icpsr议员ID和cast_code投票代码),又包含第二位议员对应投票字段的记录。
基础查询语句
假设你要对比的两位议员信息是:
- 议员A:
icpsr=21341,cast_code=1(赞成票) - 议员B:
icpsr=20337,cast_code=1(赞成票)
对应的MongoDB查询代码如下:
db.your_collection_name.find({ $and: [ { "votes": { $elemMatch: { "icpsr": 21341, "cast_code": 1 } } }, { "votes": { $elemMatch: { "icpsr": 20337, "cast_code": 1 } } } ] })
代码解释
$elemMatch:专门用来匹配数组中至少一个元素满足多字段组合条件,这里第一个$elemMatch确保文档包含议员A的目标投票记录,第二个确保包含议员B的。$and:强制要求两个条件同时成立,这样就能筛选出两位议员都参与该次投票且符合各自投票情况的文档。
优化:只返回需要的字段
如果不想返回整个文档,只想拿到投票链接和两位议员的匹配投票记录,可以加上投影(projection):
db.your_collection_name.find( { $and: [ { "votes": { $elemMatch: { "icpsr": 21341, "cast_code": 1 } } }, { "votes": { $elemMatch: { "icpsr": 20337, "cast_code": 1 } } } ] }, { "clerk_url": 1, // 保留投票的官方链接 "votes": { $elemMatch: { $or: [ { "icpsr": 21341, "cast_code": 1 }, { "icpsr": 20337, "cast_code": 1 } ] } } } )
扩展:添加更多字段匹配
如果还需要对比prob字段(比如筛选议员A的prob≥40的记录),只需要在$elemMatch里追加条件即可:
{ "votes": { $elemMatch: { "icpsr": 21341, "cast_code": 1, "prob": { $gte: 40 } } } }
注意事项
- 确保查询时的
icpsr类型和文档一致(文档里是NumberInt,直接用整数查询即可,MongoDB会自动匹配类型)。 - 如果要统计两位议员投票一致的次数,在这个查询基础上调用
countDocuments()就能得到结果。
内容的提问来源于stack exchange,提问作者sfabrey
相关产品推荐
相关产品推荐

