如何正确过滤Meteor集合中含嵌套字段meta.artist_id的文档?
解决Meteor中Meteor-files集合按嵌套meta字段过滤的问题
这个问题其实是MongoDB查询匹配规则的常见误区——你现在用的是整个嵌套对象的完全匹配,而不是针对嵌套字段的精准匹配。下面给你修正方案和详细解释:
正确的发布函数代码
直接使用MongoDB的点表示法来指定嵌套字段,这样只会检查meta对象下的artist_id字段是否匹配,完全忽略meta里的其他字段:
Meteor.publish('files.artist', function publishUserImages(){ return Images.find({ "meta.artist_id": this.userId }); });
为什么原来的写法不行?
你原来的查询条件{meta: {artist_id: this.userId}}是严格匹配整个meta对象,只有当某个文档的meta属性完全等于{artist_id: "xxx"}(没有其他额外字段)时,才会被筛选出来。而你的目标文档meta里还有artist字段,自然无法命中这个条件。
可选的进阶写法(更严谨)
如果你想确保只返回那些确实存在meta.artist_id字段且值匹配的文档,可以加上$exists操作符:
Meteor.publish('files.artist', function publishUserImages(){ return Images.find({ "meta.artist_id": { $exists: true, $eq: this.userId } }); });
这个写法会排除那些meta里没有artist_id字段的文档,比基础写法更严谨。
另外补充一点:你原来代码里的.cursor是多余的——Meteor的Collection.find()方法本身就会返回游标对象,不需要额外调用.cursor属性。
内容的提问来源于stack exchange,提问作者chidimo
相关产品推荐
相关产品推荐

