Mongoose。查找string参数

我有一个函数使用mongoose来查询我的数据库。 连接已经起作用。 但是,如果我不使用实际的string,而是stringvariables,那么.find返回一个未定义的对象(即没有find任何东西)。 这里是代码:

function getUser(obj, callback){ console.log("obj.key: " + obj.key[0].toString() + ":" + obj.value[0].toString()); var first = "name.first"; console.log("first: " + first); var second = "nicholas"; console.log("second: " + second); User.findOne({first:second}, 'name telephone address1 address2 city state zip country', function(err, user){//nothing can be found when not directly using a string!!! console.log("got this user: " + user.name); }); } 

这不起作用,但是,如果我用.findreplace这行,它会:

 User.findOne({"name.first":"nicholas"}, 'name telephone address1 address2 city state zip country', function(err, user){ 

我从来没有见过这样的事情。 通常情况下,一个string是一个string,无论你做什么,它都可以工作。 任何想法可能是错的?

psthe console.logs:

obj.key:name.first:nicholas
第一:name.first
第二:尼古拉斯
错误在:console.log(“得到这个用户…不能读取属性'名称'为空。

按照JavaScript对象的字面语法 ,在记号{first:second}first属性名称 ,而不是要扩展的variables

引用文档:

对象属性名称可以是任何string,包括空string。 如果属性名称不是有效的JavaScript标识符,则必须用引号括起来。 不是有效标识符的属性名称也不能作为点(。)属性访问,但可以使用类似数组的表示法(“[]”)进行访问和设置。


鉴于你的问题:

  • User.findOne({"name.first":"nicholas"}, ...)作为你的属性名为name.first (这是一个使用点符号的MongoDB属性)
  • User.findOne({first:"nicholas"}, ...)不起作用,因为您正在引用名为first

您可以通过使用[]来初始化您的对象字段来获得所需的结果:

 query = {} query[first] = "nicholas" // ^^^^^ // this is a variable User.findOne(query, ...) 

请注意,由于这是一个经常性的需求,ECMA 6有对象字面值计算属性键允许你写这样的事情:

 { [first]: "nicholas" } 

AFAIK,截至今天,主要的JS实现并没有太多的支持。

使用[]表示法将variables用作对象键:

 var first = "name.first"; var second = "nicholas"; var query = {}; query[first] = second; User.findOne(query, 'name telephone address1 address2 city state zip country', function(err, user){ console.log("got this user: " + user.name); });