db.collection.find(query, projection)的第二个参数为何无效?
发布于 9 天前 作者 jinkankakushoujo 610 次浏览 最后一次编辑是 4 天前 来自 问答

QQ截图20180914171602.png QQ截图20180914171346.png 看代码里的定义发现和手册里的第二个参数名称都不一样,不管用 {title: 0}还是{title: 1}返回的内容都一样。 版本是 “mongodb”: “^3.1.3”

16 回复

难道是版本太新了?

也可能是你的collection里面根本没有title这个字段,如果是这样确实返回一样,如果有这个字段这种过滤才有用

@frosh 不过关键是为什么第二个参数名字不同? 我只想要获取title但是试了 {title: 0} 和{title: 1}都是返回全部,没有任何效果。 理论上{title: 1}inclusion模式应该只返回title,哪怕就算title不存在也不应该把其他的字段都返回,并且我检查了下title拼写没有打错,就是title。

文档里第二个参数名叫projection,但是VS CODE里第二个参数名叫options?,这貌似就有问题,第二个参数名正确应该叫什么?

@jinkankakushoujo 叫projection应该是对的,如果你的记录里面不存在title字段,实际上你的query会忽略这个过滤条件,所以返回的是全部 你不给出你的所有的记录的数据,没法考证

@frosh 主要是明知自己检查了没打错字的字段发上来也是多此一举,不过我已经自己解决了。原来第二个参数名不叫projection,而是叫options,但我不知道为何网上搜到的手册都是那样乱写的。

我发现VS CODE里自带了手册URL,上去一看就发现我一楼截图里的手册是错误的。 QQ截图20180919175417.png

@frosh 我顺便测试了下你说的观点,发现{ projection: { title: 1 } }如果title不存在,会在forEach时报错TypeError: Cannot read property ‘length’ of undefined,而不是你说的 “如果你的记录里面不存在title字段,实际上你的query会忽略这个过滤条件,所以返回的是全部” ,不清楚你有没有实际验证过你的说法,也可能是版本不同?

你写错了,完整的写法是db.collection.find({},{title:1})

@frosh 我没有写错,{ projection: { title: 1 } }才是第二个参数的正确写法,你可以看下我5楼发的截图。之前我就是按你的db.collection.find({},{title:1})这样子的写法才无效,不清楚你用的mongodb的版本?也可能是我用的版本相对比较新,所以改变了。 (我刚用最新的3.1.6再次测试了下,结果还是{ projection: { title: 1 } }才是正确的)

刚才看了下你的图,你的是nodejs的api,不是mongo本身的api,你在mongmongo shell里面试试,我没像你这么写过,可能确实在node中可以这么写吧

@frosh 原来如此,也就是说我一楼的截图是mongo本身的api,所以才会和nodejs的api里的第二个参数名不一样。那么就不奇怪了。 主要是如果你说的那写法在nodejs里有效,就没有这个提问帖了。

关键一般用node的可能也不用你这个driver,我最近也用过,我用的eggjs里面的一个node的mongmongo driver,写法和shell一致,这种和shell写法有差异的,你测试会比较麻烦

@frosh 我是用npm install mongodb --save安装的库

mongodb模块2.x版本是可以那样写的,3.x之后是这样写{ projection: { title: 1 } },本来昨天我就可以给你答案的,后来忘了,这是个大坑,在一些老的项目中升级mongodb模块肯定会遇到

回到顶部