MongoDB如何查询Channels集合中包含指定所有field_name的文档?
你的问题出在对$all的用法理解上——你现在的写法是要求fields数组完全包含指定的三个完整对象,但你的实际需求是fields数组里的元素要涵盖所有指定的field_name值。
下面是两种可行的查询方法:
方法1:多条件AND匹配(直观易懂)
直接针对每个field_name设置查询条件,MongoDB默认会将多个条件视为AND关系,确保所有条件都满足:
Channel.find({ "fields.field_name": "first_name", "fields.field_name": "last_name", "fields.field_name": "state" })
或者显式用$and包裹(效果完全一致,适合复杂场景):
Channel.find({ $and: [ { "fields.field_name": "first_name" }, { "fields.field_name": "last_name" }, { "fields.field_name": "state" } ] })
方法2:使用$all针对嵌套字段(更简洁)
直接在fields.field_name路径上使用$all,要求数组中存在包含每个指定值的元素:
Channel.find({ "fields.field_name": { $all: ["first_name", "last_name", "state"] } })
为什么原代码不生效?
原代码中的{ fields: { $all: [{ "field_name": "state" }, ...] } }是在匹配fields数组中是否存在完全一致的三个对象(每个对象必须只有field_name键,且值完全匹配)。但如果你的fields数组元素还有其他隐藏字段(比如自动生成的_id),或者你只是需要匹配field_name的值而非整个对象,这种写法就会失效。
内容的提问来源于stack exchange,提问作者user17281101
相关产品推荐
相关产品推荐

