Mongodb Chats.findOne(id)不返回任何内容,但db.Chats.findOne(ObjectId(id))返回

Mongodb Chats.findOne(id)不返回任何内容,但db.Chats.findOne(ObjectId(id))返回,mongodb,collections,meteor,publish-subscribe,Mongodb,Collections,Meteor,Publish Subscribe,在我的meteor应用程序中,我想根据聊天对象的成员发布聊天伙伴:基本上有两个成员,一个不是当前用户的是我想发布的成员。这是密码。成员是始终包含两个不同用户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

在我的meteor应用程序中,我想根据聊天对象的成员发布聊天伙伴:基本上有两个成员,一个不是当前用户的是我想发布的成员。这是密码。成员是始终包含两个不同用户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:是的,我的出版物在服务器文件夹中

我的问题是:我的第一行代码返回未定义的。但是如果我在mongo上输入db.chats.findOneObjectId,我会在输出中得到我的记录及其成员。问题是,似乎我不能在Meteor中使用这个有用的ObjectId方法


我做错了什么?

您是直接将这些项目插入mongo shell,还是从另一个数据库中存储它们?默认情况下,Meteor使用字符串作为_ID,尽管在声明集合时可以通过将idGeneration选项设置为MONGO来更改,而独立MongoDB使用ObjectID,这就是您在这里看到的

长话短说,如果您的_id采用的是这种格式,那么您需要基于此进行搜索:

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