MongoDB查询问题:如何获取包含指定标签的所有文档(含多标签组合)
解决MongoDB标签匹配问题
你用$in查询只能拿到Item-001,原因很简单:$in是匹配数组里完全等于red的元素,而Item-002的tags数组里是完整的字符串"red,yellow",不是单独的red标签,所以匹配不上。
给你两种解决办法:
1. 不改数据,用正则查询
如果暂时不想动数据结构,直接用正则匹配tags里包含red的字符串:
db.getCollection("items").find({ "tags": /red/ })
要是怕误匹配darkred这类带red的其他标签,就加单词边界,确保只匹配独立的red:
db.getCollection("items").find({ "tags": /\bred\b/ })
2. 优化数据结构(推荐)
长期使用的话,建议把逗号分隔的标签拆成数组独立元素,这样查询效率更高,还能建索引。用这条语句批量更新数据:
db.getCollection("items").updateMany( { "tags": { $elemMatch: { $regex: "," } } }, [ { $set: { "tags": { $reduce: { input: "$tags", initialValue: [], in: { $concatArrays: ["$$value", { $split: ["$$this", ","] }] } } } } } ] )
更新后,Item-002的tags会变成["red", "yellow"],这时你原来的$in查询就能同时拿到两个文档了。
内容的提问来源于stack exchange,提问作者Koios Kvasir
相关产品推荐
相关产品推荐

