【问题标题】:Mongoose .find string parametersMongoose .find 字符串参数
【发布时间】:2015-05-20 21:24:46
【问题描述】:

我有一个使用猫鼬查询我的数据库的功能。连接已经有效。但是,如果我不使用实际字符串,而是使用字符串变量,那么 .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);

    });
}

这不起作用,但是,如果我用 .find 替换该行,它会起作用:

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

我以前从未见过这样的事情。通常一个字符串就是一个字符串,无论你用它做什么它都会起作用。 有什么想法可能是错的吗?

p.s.console.logs:

obj.key: name.first:nicholas
第一个:name.first
第二个: nicholas
错误:console.log("got this user...cannot read null 的属性“名称”。

【问题讨论】:

  • 看起来 JSON 对象的关键部分是问题所在。我可以将变量用于值部分,但由于某种原因,关键部分必须是字符串而不是变量。我也尝试过使用平面对象(名字而不是 name.first),但我得到了相同的结果。

标签: node.js string mongodb mongoose


【解决方案1】:

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

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);
});

【讨论】:

    【解决方案2】:

    根据JavaScript object literal syntax,在{first:second} 符号中,first 是一个属性名称,而不是一个变量,可以扩展。

    引用文档:

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


    给你一个问题:

    • User.findOne({"name.first":"nicholas"}, ...) 的工作原理是您的属性名为 name.first(这是使用 dot notation 的 MongoDB 属性)
    • User.findOne({first:"nicholas"}, ...) 不起作用,因为您引用了一个名为 first 的字段

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

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

    请注意,这是一个经常性的需求,ECMA 6 有 object literal computed property keys 允许您编写 类似 的东西:

    { [first]: "nicholas" }
    

    AFAIK,到目前为止,主要的 JS 实现并不太支持它。

    【讨论】:

    • 酷!这实际上很有意义,尽管我不得不承认我自己不会想出这个。 {[first]:"nicholas"} 无法正常工作,但也许我用错了,但是创建一个对象作为查询的数组很有魅力,而且这正是我想要做的,所以谢谢为此:)
    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 2016-06-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2021-05-06
    相关资源
    最近更新 更多