2016-09-16 117 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