【问题标题】:MongoDB Query Returns Empty Nested ObjectMongoDB 查询返回空嵌套对象
【发布时间】:2017-07-23 09:53:14
【问题描述】:

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

据我所见,数据已正确存储在数据库中,当我查询它时,除了几个嵌套对象(对话所属的两个用户)之外,一切都按我的预期返回。

这是我在 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});
    }
  });
});

非常感谢您的帮助!

【问题讨论】:

    标签: node.js mongodb express mongoose database


    【解决方案1】:

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

    console.log(JSON.stringify(conversation))
    

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

    【讨论】:

    • 非常感谢安德烈斯克。你是对的,当我对它进行字符串化时,我得到了我期望的数据。不过,当我将它传递给客户端时,我无能为力。在将其传递给客户端之前,我是否必须对其进行字符串化并将其放回 JS 对象中?
    • 我从您的其他答案中看到您已修复,太好了:)
    【解决方案2】:

    修好了!

    Andresk 上面的回答是朝着正确的方向大力推动。正如他所说,一切都很好,但我没有以正确的方式访问返回的对象。现在很明显,但我没有提供“convos”对象的索引号。

    我只需要这样做,即使我只从 MongoDB 得到一个“对话”文档:

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

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多