Node.js 查找字符串参数
我有一个使用mongoose查询数据库的函数。连接已经工作了。但是,如果我不使用实际字符串,而是使用字符串变量,那么.find将返回一个未定义的对象(即,它找不到任何内容)。代码如下:Node.js 查找字符串参数,node.js,string,mongodb,mongoose,Node.js,String,Mongodb,Mongoose,我有一个使用mongoose查询数据库的函数。连接已经工作了。但是,如果我不使用实际字符串,而是使用字符串变量,那么.find将返回一个未定义的对象(即,它找不到任何内容)。代码如下: function getUser(obj, callback){ console.log("obj.key: " + obj.key[0].toString() + ":" + obj.value[0].toString()); var first = "name.first"; cons
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);
});
}
但是,如果我将该行替换为。find,则它会:
User.findOne({"name.first":"nicholas"}, 'name telephone address1 address2 city state zip country', function(err, user){
我以前从未见过这样的事。通常一个字符串就是一个字符串,不管你用它做什么,它都会工作。
你知道哪里不对吗
p、 s.控制台日志:obj.key:name.first:nicholas
first:name.first
second: nicholas
错误位于:console.log(“获取此用户…无法读取 属性“name”为null 根据,在表示法
{first:second}
中,first
是一个属性名,而不是一个需要扩展的变量
引用该文件:
对象属性名称可以是任何字符串,包括空字符串。如果属性名称不是有效的JavaScript标识符,则必须将其括在引号中。不是有效标识符的属性名称也不能作为点(.)属性访问,但可以使用类似数组的符号(“[])进行访问和设置
给你一个问题:
的工作原理是将属性命名为User.findOne({“name.first”:“nicholas”},…)
(这是一个使用name.first
在引用名为User.findOne({first:“nicholas”},…)
first
[]
初始化对象字段,可以获得所需的结果:
query = {}
query[first] = "nicholas"
// ^^^^^
// this is a variable
User.findOne(query, ...)
请注意,由于这是一个经常性的需求,ECMA 6允许您编写类似的内容:
好了,到今天为止,主要的JS实现还不太支持这一点。使用
[]
符号将变量用作对象键:
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);
});
JSON对象的关键部分似乎是问题所在。我可以使用变量作为值部分,但出于某种原因,关键部分必须是字符串而不是变量。我也尝试过使用平面对象(firstname而不是name.first),但我得到了相同的结果。酷!这实际上很有道理,尽管我不得不承认,我自己不会想到这一点。{[首先]:“nicholas”}不起作用,但可能我用错了,但创建一个对象作为查询数组很有魅力,而且正是我想做的,所以谢谢:)
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);
});