我在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语句。
可能是我应该知道的微不足道的事情,但我不知道:(
答案 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...
});
});
}
});