Chats.findOne(id)什么都不返回,但是db.chats.findOne(ObjectId(id))没有

时间:2014-07-29 21:17:31

标签: mongodb collections meteor publish-subscribe

在我的流星应用程序中,我想根据聊天对象的成员发布一个聊天对象:基本上有两个成员,一个不是当前用户的成员是我想要发布的成员。这是代码。 (members是一个总是包含两个不同用户ID的列表)

Meteor.publish('chatmate', function(chat_id) {
  var chat = Chats.findOne({_id:chat_id, members: this.userId});
  var chatmate = undefined; // just in case... didn't know any better
  if (chat) {
    for (var i = 0; i < 2; i++) {
      if (chat.members[i] !== this.userId)
        chatmate = Meteor.users.find(chat.members[i], {fields: {'profile.name': 1}});
    }
  }
  return chatmate;
});

(PS:是的,我的出版物在服务器文件夹中)

我的问题是:我的第一行代码返回undefined。但是如果我继续使用mongo并键入db.chats.findOne(ObjectId('<mychatsid>')),我会在输出中及其成员中获得记录。问题是,我似乎无法在Meteor中使用这个有用的ObjectId()方法!

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

您是否将这些项目直接插入mongo shell,或者从另一个数据库中mongorestore将它们插入?默认情况下,Meteor使用_id s的字符串(尽管可以通过在声明Collection时将idGeneration选项设置为"MONGO"来更改,as discussed here)单独MongoDB使用ObjectIds,这就是你在这里得到的。

简而言之,您需要create a new ObjectID object并根据此搜索,如果这是_id所在的格式:

Chats.findOne({ _id: new Meteor.Collection.ObjectID(chat_id), members: this.userId });