查询内部查询失败,节点本机驱动程序

时间:2015-02-21 16:48:48

标签: node.js mongodb node-mongodb-native

我在mongo客户端中获得了这个代码,产生了我期望的内容:

db.bookings.find().forEach(
    function(booking) {
        booking.visitor = db.visitor.findOne({id:booking.visitor_id});
        db.bookingsReloaded.insert(booking)
    }
)

节点10.x和mongo本机驱动程序(v2.1.x)中的代码如下所示:

bookings.find({}).each(
function(err, booking){
    if (booking == null ){
        ...
    } else {
        booking.visitor = booking.findOne({id:booking.visitor_id});
        bookingsReloaded.insert(booking);           
    }
});

在执行代码(预订和访客是现有集合)之后,新的集合bookingReloaded包含预期的结果(嵌入的访问者文档),当使用mongo客户端执行时,节点代码不起作用,它看起来喜欢它甚至不执行findOne语句。

可能是我应该知道的微不足道的事情,但我不知道:(

1 个答案:

答案 0 :(得分:0)

mongo客户端shell是同步的,而node.js是异步的。因此,findOne调用的结果是通过回调传递的,而不是返回的。

所以你的node.js代码需要看起来像这样:

bookings.find({}).each(
    function(err, booking){
        if (booking == null ){
            ...
        } else {
            visitors.findOne({id: booking.visitor_id}, function(err, visitor) {
                booking.visitor = visitor;
                bookingsReloaded.insert(booking, function (err, inserted) {
                    ...error handling...
                });           
            });
        }
    });