MongoDB获取字段值的长度

4

我已经看过这些帖子:

mongoDB中字符串字段值的长度

在mongodb中选择字符串长度

但是我的问题不同。当我运行这个查询时:

db.usercollection.find({$where: "this.profile.name.length < 20"}).limit(2);

我得到了以下错误:
Error: error: {
    "ok" : 0,
    "errmsg" : "TypeError: this.profile is undefined :\n_funcs2@:1:24\n",
    "code" : 139
}

当我运行这个查询时:

db.usercollection.find({"profile.name": {$exists: true}, $where: "this.profile.name.length <20"}).limit(2); 

没有错误,但是结果为空,尽管我的集合中有两个文档的profile.name<20

MongoDB shell版本:3.2.11


1
如果你遇到了错误 this.profile is undefined,为什么不尝试检查字段呢?例如:db.usercollection.find({"profile": {"$exists": true}, "$where": "this.profile.name.length <20"}).limit(2); - chridam
你的文档模式是什么样子的? - sergiuz
@SergiuZ 个人资料{ 姓名 = Arijit,年龄 = 20 },地址{ 街道 = abc 街道,邮编 = 2345 } - Arijit
@chridam,如果嵌入的文档“profile”没有键“name”,那么也可能会引发错误。 - sergiuz
@Arijit,我无法弄清楚为什么你的第二个查询返回空结果,我认为它是正确的,但可能存在其他问题,所以我发布了一个答案。也许你可以发布更多的数据? - sergiuz
2个回答

4

有一个文档中不存在profile键(嵌入式文档),由于试图访问对象的不存在属性,JavaScript表达式抛出错误:

db.usercollection.find({$where: "this.profile.name.length < 20"}).limit(2);

您的第二个查询可以正常工作,因为它匹配所有存在profile.name的文档:

db.usercollection.find({"profile.name": {$exists: true}, $where: "this.profile.name.length <20"}).limit(2); 

第二个查询应该返回所需的结果。

谢谢你的回答。第一个逻辑是正确的。我的一些文档中没有这个字段。但我想知道为什么第二个查询返回的结果是空的。 - Arijit
1
第二个查询已经测试并在我的测试数据中返回了预期的结果。问题可能出在你的数据上?请发布你的文档并(再次检查)你的查询是否正确,再次检查你的流程,我没有其他线索。 - sergiuz

-2

可以在where子句本身检查profile.name

db.usercollection.find({$where: "this.profile && this.profile.name && this.profile.name.length < 20"}).limit(2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接