2016-09-16 78 views
0

我使用TypeScript/Javascript与Meteor/Mongo。Mongo光标更新

我正在尝试更新其lastMessageCreatedAt字段上带有时间戳的光标。

updateChat(senderId: string, chatId: string): void { 

    const chatExists = !!Chats.find(chatId).count(); 
    if (!chatExists) throw new Meteor.Error('chat-not-exists', 
     'Chat doesn\'t exist'); 

    const chat1 = Chats.find(chatId); 
    const receiverId = chat1.memberIds.find(memberId => memberId != senderId); // <=== error TS2339: Property 'memberIds' does not exist on type 'Cursor<Chat>'. 

    const chat = { 
     memberIds: [senderId, receiverId], 
     lastMessageCreatedAt: new Date() 
    }; 

    Chats.update(chat); // <=== error TS2346: Supplied parameters do not match any signature of call target. 
    }, 

模型

interface Chat { 
    _id?: string; 
    memberIds?: string[]; 
    title?: string; 
    picture?: string; 
    lastMessage?: Message; 
    lastMessageCreatedAt?: Date; 
    receiverComp?: Tracker.Computation; 
    lastMessageComp?: Tracker.Computation; 
    } 

问题

不过,我得到上述错误。我如何更新光标以获得时间戳?我是Meteor/Mongo的新手,所以我可能会接近完全错误的。

回答

0

更新代码不正确。它应该是这样的

var date=new Date(); 

Chats.update({membersIds:{$all:[senderId,receiverId]}},{$set:{lastMessageCreatedAt: date}}); 

请参阅docs了解更多信息。

+1

感谢您的回复。但是,这不会更新。我也没有看到任何错误。时间戳保持不变:'{ “_id”: “8wca85kB7tHEudgjJ”, “memberIds”:[ “P9”, “J64” ], “lastMessageCreatedAt”:“2016-09-16T16:13:35.942 Z“ } ]' – Richard

+0

嗨,我已更正了代码。我错过了'全部'运营商。 – Ankit

+0

谢谢。我测试了它,但它仍然没有更新:'[{“_id”:“8wca85kB7tHEudgjJ”,“memberIds”:[“P9”,“J64”],“lastMessageCreatedAt”:“2016-09-16T16:13:35.942 Z“}] app.bundle.js(line 481) updateChat:P9,J64,Fri Sep 16 2016 21:34:45 GMT + 0200(南非标准时间) app.bundle.js(line 483) [{“_id”:“8wca85kB7tHEudgjJ”,“memberIds”:[“P9”,“J64”],“lastMessageCreatedAt”:“2016-09-16T16:13:35.942Z”}]' – Richard

0

首先,如果有单个聊天,那么最好使用mongo findOne(),而不是find(),尤其是如果您使用记录_id。记住find()或findOne()接受一个查询json对象,并且一个可选的投影(Mongo代表字段返回)json对象。如果省略投影,它将返回所有字段。

const chatFound = Chats.findOne(
    { '_id': 
    { $eq: chatId}, 
    }); 

同样,您可以使用update()或updateOne() mongo方法。只是阅读文档,因为它们略有不同,但本质上是采取查询,更新,&选项json对象。

Chats.update(
    { '_id': 
    { $eq: chatId}, 
    }, 
    { 'memberIds': memberIds, 
    'lastMessageCreatedAt': new Date() 
    } 
); 

一个蒙戈功能,是非常有用的,但似乎并不需要为您的情况,是UPSERT,这无论是插入或更新记录....

Chats.update(
    { '_id': 
    { $eq: chatId}, 
    }, 
    { 'memberIds': memberIds, 
    'lastMessageCreatedAt': new Date() 
    }, 
    { upsert: true } 
); 

最后记住你可以在编码之前使用Mongo命令行来测试你的查询。从终端窗口运行Meteor Mongo。

+0

谢谢Philip。当我回到我的电脑时,我会明天尝试它。 – Richard