Как сделать запрос с помощью точки (.) через Mongoose в Node.js и как добавить пустой массив

У меня есть следующая схема:

var userSchema = new Schema({

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


});

Во-первых, как добавить пустой массив? Правильно ли я делаю следующее?

teams:{},

Во-вторых, я пытаюсь выполнить запрос с помощью Mongoose в своем Node.js, но получаю ошибку в точке ('.'):

Это мой документ, который я сохраняю:

 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, но не нашел.

Спасибо за Ваше понимание.


person AndBecaPine    schedule 14.07.2014    source источник
comment
По крайней мере, чтобы быть действительным JavaScript, вам придется заключать ключ в кавычки, поскольку он не является идентификатором — {"socialMedias.socialMediaType": socialMediaID }.   -  person Jonathan Lonowski    schedule 14.07.2014
comment
Но я не могу его процитировать, потому что этот ключ получает функция. Так что может быть 3 возможных имени.   -  person AndBecaPine    schedule 15.07.2014
comment
Для этого литералы/инициализаторы объектов не оценивают ключи как переменные. Имя самого идентификатора становится ключом. У вас будет для построения объекта с помощью квадратных скобок.   -  person Jonathan Lonowski    schedule 15.07.2014
comment
хорошо, я постараюсь сделать это. Просто не знаю как, так как я не знаю, какое слово я получаю.   -  person AndBecaPine    schedule 15.07.2014
comment
@JonathanLonowski, мне нужно заключать это в двойные кавычки или только в одну (')? Я спрашиваю, потому что в документации MongoDB есть только один, как «fsfe», а в вашем комментарии два, как srrr.   -  person AndBecaPine    schedule 16.07.2014
comment
В JavaScript вы можете использовать любой из них. разница в том, что цитата, используемая для строки, должна быть экранирована при включении в качестве символа - 'Joe\'s' против "Joe's". В остальном они идентичны.   -  person Jonathan Lonowski    schedule 16.07.2014
comment
В порядке. Понятно. Спасибо. :)   -  person AndBecaPine    schedule 16.07.2014


Ответы (1)


Здесь есть ряд проблем, с которыми вы, вероятно, столкнетесь.

Во-первых, team — это свойство массива, но вы присваиваете ему объект. Вам нужно сделать что-то вроде этого:

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

Но в-четвертых, даже это не сработает, потому что вы синхронно возвращаете пользователя из метода, который выполняет асинхронную операцию. Есть разные способы решить эту проблему, но вы можете начать с чтения промисов или передачи функции обратного вызова в searchUser.

person user1417684    schedule 15.07.2014
comment
Спасибо за ваш ответ. Я это попробую. - person AndBecaPine; 15.07.2014
comment
Если можете, не могли бы вы объяснить, почему «социальные сети» не будут работать так, как сейчас? - person AndBecaPine; 15.07.2014
comment
Когда вы говорите users.findOne({socialMedias.socialMediaType: socialMediaID}, ...), часть слева от : недействительна как есть, ее нужно заключать в кавычки. Однако я не верю, что вы можете сделать это непосредственно в определении анонимного объекта, как это было изначально. Поэтому для этого используется временный объектный запрос. - person user1417684; 15.07.2014
comment
Спасибо. Еще один вопрос: что вы имеете в виду под чтением обещаний или передачей функции обратного вызова в searchUser? - person AndBecaPine; 15.07.2014
comment
Я имею в виду, что это два способа обработки асинхронной операции, которую вам нужно выполнить здесь. Для промисов я предлагаю Q: github.com/kriskowal/q. - person user1417684; 15.07.2014
comment
Еще раз спасибо. Я читал про промисы, но это слишком сложно для такой простой вещи. Как вы думаете, мне действительно нужно использовать Promise в этой функции? как насчет обратного звонка? - person AndBecaPine; 16.07.2014
comment
Вам не нужно, для простых вещей обратный вызов может подойти, но это действительно зависит от вашего дизайна и предпочтений. - person user1417684; 16.07.2014
comment
В порядке. Спасибо. Можешь помочь мне еще раз? Я собираюсь обновить свой вопрос. У меня проблемы с MongoDB. Только эта часть. - person AndBecaPine; 16.07.2014
comment
Я обновил его. Если вы можете помочь мне, это было бы здорово. Я слишком долго это делаю. :/ - person AndBecaPine; 16.07.2014
comment
Вы должны создать для этого новый вопрос, так как он как бы отклоняется от исходной темы. - person user1417684; 16.07.2014