MongoDB查询返回空嵌套对象

时间:2016-10-08 21:44:10

标签: node.js mongodb express mongoose database

我在MongoDB中有一个'对话'集合,我从NodeJS查询使用返回的数据来呈现对话的页面。

据我所知,数据已正确存储在数据库中,当我查询它时,除了几个嵌套对象 - 对话所属的两个用户之外,所有内容都会回来。 / p>

这是我在console.log会话时得到的内容(注意'参与者'字段:

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

在Mongo shell中,参与者拥有正确的信息 - 两个参与者的ID和用户名。

这是架构:

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

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

似乎一切正常,console.log默认情况下不会打印嵌套对象。尝试使用:

console.log(JSON.stringify(conversation))

记录对话以查看参与者对象时。

答案 1 :(得分:0)

修正了它!

安德列斯克上面的答案是朝着正确方向迈出的一大步。正如他所说,一切都很好,但我没有以正确的方式访问返回的对象。现在很明显,但我没有提供'convos'对象的索引号。

我只需要这样做,即使我只是从MongoDB获取一个'对话'文档:

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