Проблема с параметром Mongoose Model.find()

Я сейчас работаю над приложением node (с интерфейсом IOS) и наткнулся на эту проблему. Я использовал mongodb вместе с мангустом. У меня есть этот маршрут /get, который получает правильный идентификатор пользователя и пытается найти все «Voots» с тем же идентификатором пользователя. Вот как выглядит «Вот»:

{
"_id": "59db9fa2659bb30004899f05",
"title": "Pizza!",
"body": "hoppakeeee",
"user": {
  "__v": 0,
  "password": "$2a$10$Rwb5n7QoKaFaAOW37V0aWeEeYgfn6Uql474ynUXb83lHi7H2CuB1u",
  "email": "[email protected]",
  "name": "Noelle Schrikker",
  "_id": "59db9ecf659bb30004899f04"
},
"__v": 0,
"downVotes": [],
"upVotes": []

},

Как видите, у него есть свойство user, которое представляет собой объект пользователя, содержащий имя, адрес электронной почты, пароль и _id.

Я делаю это со своим запросом:

// Send all voots from the specific user
        Voot.find({"user._id": userId}, function(err, voots) {
            if (err) {
                console.log(err);
                res.status(400).send(err)
                res.end()
            }

            if (voots) {
                res.status(200).send(voots)
                res.end()
            }
        })

Пытаюсь найти все вооты с их user имеющими свойство userId (это правильный ID пользователя). Однако это не работает. Я попытался найти его с помощью "user.email", который действительно работает. Я думаю, это как-то связано с _ перед id. Любой комментарий приветствуется!

Вот шема:

var vootSchema = new mongoose.Schema({
    title: String,
    body: String,
    user: {
        type: mongoose.Schema.Types,
        ref: 'user'
    },
    upVotes: [String],
    downVotes: [String]
})

var Voot = mongoose.model('voot', vootSchema)

Схема пользователя:

var userSchema = new mongoose.Schema({
    name: String,
    email: String,
    password: String
})

var User = mongoose.model('user', userSchema)

person Community    schedule 09.10.2017    source источник
comment
Возможное несоответствие типов между userid и _id в документе.   -  person Pubudu Jayawardana    schedule 09.10.2017
comment
Нет, я распечатал идентификатор пользователя перед тем, как передать его маршруту, и он действительно совпадает... Спасибо за комментарий!   -  person    schedule 09.10.2017
comment
Можете ли вы обновить свой вопрос, включив в него определение схемы для Voot?   -  person JohnnyHK    schedule 09.10.2017
comment
Конечно! Я могу это сделать!   -  person    schedule 09.10.2017
comment
Можете ли вы обновить вопрос со схемой пользователя?   -  person Ivan Vasiljevic    schedule 09.10.2017
comment
Я обновил UserSchema   -  person    schedule 09.10.2017
comment
я обновил свой ответ   -  person Ivan Vasiljevic    schedule 09.10.2017
comment
Я попробую! Надеюсь, что это работает!   -  person    schedule 09.10.2017
comment
type: mongoose.Schema.Types не является допустимым определением типа. Это опечатка?   -  person JohnnyHK    schedule 09.10.2017
comment
Нет, я думаю, что это проблема, я думал, что при сохранении mongoose.Schema.Types.ObjectId сохраняется только идентификатор объекта, поэтому я удалил ObjectId, который поместил весь объект пользователя в свойство user. Однако теперь я понял, что вы можете получить доступ к объекту пользователя через этот идентификатор объекта, используя население.   -  person    schedule 09.10.2017


Ответы (3)


Я бы предположил, что _id объекта user не является строкой. Тем не менее, вам нужно изменить свой запрос, чтобы использовать ObjectId вместо строки:

     Voot.find({"user._id": ObjectId(userId)}, function(err, voots) {
        if (err) {
            console.log(err);
            res.status(400).send(err)
            res.end()
        }

        if (voots) {
            res.status(200).send(voots)
            res.end()
        }
     })

Если вы не хотите менять свой запрос, вы можете изменить свою схему user, чтобы _id была строкой. Затем ваш запрос должен начать работать:

var userSchema = new mongoose.Schema({
    _id: { type: String },
    name: String,
    email: String,
    password: String
})

var User = mongoose.model('user', userSchema)
person Ivan Vasiljevic    schedule 09.10.2017
comment
К сожалению, это тоже не решение. Потому что поиск объекта без метода ObjectId() в моем случае нормально работает. Этот не должен быть другим. - person ; 09.10.2017
comment
Что ж, вы можете изменить _id в пользовательской схеме на строку, и тогда ваш запрос должен работать. - person Ivan Vasiljevic; 09.10.2017
comment
Я мог бы попробовать это, но я только что видел видео с парнем, который объясняет, что мангуст автоматически изменяет ввод для _id, чтобы он соответствовал типу, поэтому не имеет значения, как я его передаю. Вот почему он обычно работает . Ура мангуст! - person ; 09.10.2017
comment
Я не уверен в этом. Вы можете найти много вопросов с похожими проблемами. И это не проблема с мангустом, а с самой MongoDB. stackoverflow.com/ вопросы/7878557/ - person Ivan Vasiljevic; 09.10.2017
comment
Пытался вставить: type: String, но это тоже не работает, просто возвращает пустой массив - person ; 09.10.2017

Используйте в запросе просто user, а не user._id:

Voot.find({ "user": userId }, function(err, voots) {
  // Callback code
})

Идентификатор или указанный пользователь хранится в поле пользователь. Поддокумент пользователя и, следовательно, поле user._id будут доступны только после заполнения.

person Steve Holgado    schedule 09.10.2017
comment
В вашей vootSchema тип поля пользователя должен быть типа ObjectId. В настоящее время у вас есть только: mongoose.Schema.Types - person Steve Holgado; 09.10.2017
comment
Но тогда я ввожу только идентификатор, таким образом, у меня есть весь пользовательский объект. - person ; 09.10.2017
comment
Что вы имеете в виду под населением? - person ; 09.10.2017
comment
Вы должны сохранить идентификатор пользователя, а затем это поле будет заменено ссылочным пользовательским документом с использованием населения. Я думал, это то, чего ты пытаешься достичь. - person Steve Holgado; 09.10.2017
comment
Аааа, я думаю, что неправильно понял, просто сохранив mongoose.schema.types.objectId, вы можете получить доступ к объекту пользователя, используя население? (вместо хранения только mongoose.schema.types) - person ; 09.10.2017

Понятно! Я добавил .ObjectId в схему Voot, теперь я могу получить доступ к объекту User, используя заполнение. Теперь я могу найти Voot, используя:

Voot.find({“user”: userId}).populate(‘user’) .exec()

Спасибо за ответы на все вопросы!

person Community    schedule 09.10.2017