mongo / node异步检查数据库中是否存在文档,否则修改对象

时间:2016-01-23 21:19:01

标签: node.js mongodb coffeescript

我正在尝试确定集合中是否存在文档(作为对象数组的一部分接收)。如果它不存在,我希望插入文档并在对象中添加“unread = true”。

以上咖啡脚本中的代码如下:

updateEvents = (db, events, done) ->

async.each events, (eventobj, cb) ->
    # check whether event exists in event collection
    db.Event.count eventobj, (err, count) ->
        # if it doesn't
        if count is 0
            # insert the document and when finished set an unread property on this object to true
            db.Event.insert eventobj, (err) ->
                eventobj.unread = true
        # if it does, log that is was found
        else
            console.log "yep, found it"

# pass results back up chain to client
done null, events

在分配后控制台记录时,eventobj上会显示未读属性,但是,当传递给客户端时,它不会保留。就好像任务从未发生过一样。为什么会这样?

这与类型错误问题不同,因为它涉及数据流问题,而不是任何类型的错误。

3 个答案:

答案 0 :(得分:0)

您应该在unread操作之前将true设置为insert

eventobj.unread = true
db.Event.insert eventobj, (err) ->
    // error handling

而不是在回调函数中设置unread。当您在回调函数中设置它时,eventobj已经保存到db中,只需更改eventobj本身。

答案 1 :(得分:0)

正如zangw所说,你应该在插入 if 之前设置属性,你想要在db中保存未读属性。我从你的问题中得到的是你只想返回events数组,其中一个未读属性附加到db中不存在的每个对象。在任何一种情况下,您都应该更新要返回的实际事件数组。 而不是:

eventobj.unread = true

执行:

var index = events.indexOf(eventobj);

if (index !== -1) {
  events[index].unread = true;
}

答案 2 :(得分:0)

解决。问题是async.each在调用完成回调时没有完成执行。我将完成的回调放入一个匿名函数,并将其作为async.each函数的可选回调附加。

updateEvents = (db, events, done) ->

async.each events, ((eventobj, cb) ->
    # check each event to see if it exists in users collection
    db.Event.count eventobj, (err, count) ->
        # if it doesn't
        if count is 0
            # # insert the document and when finished set an unread property on this object to true
            db.Event.insert eventobj
            eventobj.unread = true
            cb()
        # if it does, log that is was found
        else
            console.log "yep, found it"
            cb()
# pass results back up chain to client
), finished = -> done null, events