How to do a query using dot( . ) through Mongoose in Node.js and How to add an empty array

[亡魂溺海] 提交于 2019-12-13 18:31:58

问题


I have the following schema:

var userSchema = new Schema({

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


});

First, How can I add an empty array? Is it right the way I am doing in the following?

teams:{},

Second, I am trying to do a query using Mongoose in my Node.js but I am getting an error in the dot ('.'):

This is my document I am saving:

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

where userName, socialMediaType and socialMediaID are parameters of a function.

So, after I add this doc, I am trying to do the following query:

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

but I am getting an error in this :

socialMedias.socialMediaType

So, how can I do this query?

I tried to find in Mongoose Documentation but I did not find.

Thank you for your understanding.


回答1:


There's a number of issues here that you are likely running into.

First, teams is an array property, but you're assigning an object to it. You need to do something like this:

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

Second, if socialMediaType is passed in as a function param, you can't use it like you're doing. You need to do something like this:

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

Third your findOne is not going to work as is. From what I can gather of your intention here, you need something like this:

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

But fourth, even that won't work because you are synchronously returning user from a method that performs and asynchronous operation. There are various ways to solve that, but you can start by reading up about promises, or passing a callback function into searchUser.



来源:https://stackoverflow.com/questions/24744761/how-to-do-a-query-using-dot-through-mongoose-in-node-js-and-how-to-add-an-e

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!