如何在 Node.js 中通过 Mongoose 使用 dot(.) 进行查询以及如何添加空数组

Posted

技术标签:

【中文标题】如何在 Node.js 中通过 Mongoose 使用 dot(.) 进行查询以及如何添加空数组【英文标题】:How to do a query using dot( . ) through Mongoose in Node.js and How to add an empty array 【发布时间】:2014-09-04 20:31:29 【问题描述】:

我有以下架构:

var userSchema = new Schema(

        userID: Number,
        userName: String,
        userEmail: String,
        teams:Array,
        socialMedias:
        
        fbUID: String,
        googleUID: String,
        twitter: String 


);

首先,如何添加一个空数组?我在下面的做法是否正确?

teams:,

其次,我尝试在我的 Node.js 中使用 Mongoose 进行查询,但在点 ('.') 中出现错误:

这是我正在保存的文档:

 var user = new users(
        userID: id, //give the id of the next user in Dbase
        userName: userName, 
        userEmail: 'userEmail',
        teams:,
        socialMedias: [socialMediaType: socialMediaID]
     );

其中 userName、socialMediaType 和 socialMediaID 是函数的参数。

因此,在添加此文档后,我正在尝试执行以下查询:

function searchUser(socialMediaID, socialMediaType)
    var user

     users.findOne(socialMedias.socialMediaType: socialMediaID, function(err, userFound)

        if(err) return handleError(err);
       user = userFound; 
     );

     //what does  MongoDb return if it does not find the document?

     return user;

但我在这方面遇到了错误:

socialMedias.socialMediaType

那么,我该怎么做这个查询呢?

我试图在 Mongoose 文档中找到,但没有找到。

感谢您的理解。

【问题讨论】:

至少要成为有效的 javascript,您必须引用密钥,因为它不是标识符 -- "socialMedias.socialMediaType": socialMediaID 但是我不能引用它,因为这个键是由函数接收的。所以它可以是 3 个可能的名称。 为此,对象文字/初始化器不会将键作为变量进行评估。标识符本身的名称成为键。 You'll have to build the object with bracket notation. 好的,我会尝试这样做。只是不知道怎么做,因为我不知道我收到的是哪个词。 在 JavaScript 中,you can use either. 唯一的区别是用于字符串的引号在包含为字符时需要转义 -- 'Joe\'s' vs "Joe's"。否则,它们是相同的。 【参考方案1】:

您可能会遇到很多问题。

首先,teams 是一个数组属性,但您要为其分配一个对象。你需要做这样的事情:

var user = new users(
    userID: id, //give the id of the next user in Dbase
    userName: userName, 
    userEmail: 'userEmail',
    teams:[],
    socialMedias: [socialMediaType: socialMediaID]
);

其次,如果 socialMediaType 作为函数参数传入,则不能像现在这样使用它。你需要做这样的事情:

var socialMedias = ;
socialMedias[socialMediaType] = socialMediaID;
var user = new users(
    userID: id, //give the id of the next user in Dbase
    userName: userName, 
    userEmail: 'userEmail',
    teams:[],
    socialMedias: [socialMedias]
);

第三,您的 findOne 无法按原样工作。根据我在这里收集到的你的意图,你需要这样的东西:

function searchUser(socialMediaID, socialMediaType)
    var user
    var query = ;
    query["socialMedias."+socialMediaType] = socialMediaID;

    users.findOne(query, function(err, userFound)

        if(err) return handleError(err);
        user = userFound; 
    );

    //what does  MongoDb return if it does not find the document?

    return user;

但第四,即使这样也行不通,因为您正在从执行异步操作的方法同步返回用户。有多种方法可以解决这个问题,但您可以先阅读有关 Promise 的内容,或将回调函数传递给 searchUser。

【讨论】:

感谢您的回答。我会试试看。 如果可以,您能解释一下为什么“socialMedias”不能像现在这样工作吗? 当你说 users.findOne(socialMedias.socialMediaType: socialMediaID, ...) 时, : 左边的部分是无效的,它需要被引用。但是,我不相信您可以像最初那样直接在匿名对象定义中执行此操作。所以使用临时对象查询来做到这一点。 我的意思是,这是处理您需要在此处完成的异步操作的两种方式。对于承诺,我建议 Q:github.com/kriskowal/q. 你不需要,对于简单的东西,回调可能没问题,但这真的取决于你的设计和偏好。

以上是关于如何在 Node.js 中通过 Mongoose 使用 dot(.) 进行查询以及如何添加空数组的主要内容,如果未能解决你的问题,请参考以下文章

如何对对象node.js和mongoose进行排序

Node.js安装教程--windows中通过安装nvmw方式安装管理node

Mongoose(node.js 模块)导致 CPU 使用率高

Mongoose(node.js 模块)导致 CPU 使用率高

Mongoose(node.js 模块)导致 CPU 使用率高

Mongoose(node.js 模块)导致 CPU 使用率高