Запрос MongoDB возвращает пустой вложенный объект

#node.js #mongodb #express #mongoose #database

#node.js #MongoDB #выразить #мангуст #База данных

Вопрос:

У меня есть коллекция ‘conversations’ в MongoDB, которую я запрашиваю у NodeJS, чтобы использовать возвращенные данные для отображения страницы беседы.

Данные были сохранены в базе данных правильно, насколько я могу видеть, когда я запрашиваю его, все возвращается, как я и ожидал, за исключением пары вложенных объектов — двух пользователей, которым принадлежит диалог.

Вот что я получаю при консоли.запишите беседу (обратите внимание на поле «участники»:

 [ { _id: 57f96549cc4b1211abadf28e,
    __v: 1,
    messages: [ 57f96549cc4b1211abadf28d ],
    participants: { user2: [Object], user1: [Object] } } ]
  

В оболочке Mongo у участников есть правильная информация — идентификатор и имя пользователя для обоих участников.

Вот схема:

 var ConversationSchema = new mongoose.Schema({
  participants: {
      user1:
        {
          id: String,
          username: String
        },
      user2:
        {
          id: String,
          username: String
        },
    },
  started: Number,
  messages: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Message"
    }
  ]
});
  

Вот создание документа беседы:

 var conv = {
  participants : {
    "user1" : {
      "id" : req.body.senderId,
      "username" : req.body.senderName
    },
    "user2" : {
      "id" : req.body.recipientId,
      "username" : req.body.recipientName
    }
  },
  created : Date.now(),
  messages : [] // The message _id is pushed in later.
}
Conversation.create(conv, function(err, newConvo){
  if(err){
    console.log(err);
  } else {
    newConvo.messages.push(newMessage);
    newConvo.save();
  }
})
  

И, наконец, на случай, если это полезно, вот запрос к Mongo:

 // view all conversations a user belongs to
app.get('/messages', function(req, res){
  Conversation.find({
    $or : [
      {"participants.user1.id" : req.user._id},
      {"participants.user2.id" : req.user._id}
    ]
  }, function(err, convos){
    if(err){
      console.log('Error getting Convos '   err)
    } else {
      res.render('messages', {convos: convos, currentUser: req.user});
    }
  });
});
  

Большое спасибо за любую помощь!

Ответ №1:

Кажется, что все в порядке, console.log just не печатает вложенные объекты по умолчанию. Попробуйте использовать:

 console.log(JSON.stringify(conversation))
  

При регистрации разговора, чтобы увидеть объекты участников.

Комментарии:

1. Большое спасибо Andresk. Вы правы, когда я его строю, я получаю ожидаемые данные. Тем не менее, когда я передаю его на сторону клиента, я ничего не могу с этим поделать. Должен ли я упорядочить его и поместить обратно в объект JS перед передачей его клиенту?

2. Я вижу из вашего другого ответа, который вы исправили, отлично 🙂

Ответ №2:

Исправлено!

Ответ Андреска выше был большим толчком в правильном направлении. Как он сказал, все было в порядке, но я неправильно обращался к возвращаемому объекту. Теперь это очевидно, но я не указывал номер индекса для объекта ‘convos’.

Мне просто нужно было это сделать, хотя я получал только один документ «беседы» из MongoDB:

 console.log(convos[0].participants.user1.username);