2013-02-23 43 views
-1

在下面的查询中,回调函数从不触发。这几乎是一个查询的逐字克隆,在我的应用程序的其他地方工作正常。所以我无法弄清楚问题所在。有人可以发现我做错了什么吗?为什么这个Mongo查询中的回调永远不会被调用?

var imagesCollection = db.collection('Images'); 

    var Images = new Array(); 

    while(Images.length < quantity) { 
     var random = Math.random(); 

      imagesCollection.find({ 
       "audioFiles.audioLanguage": audioLanguage, 
       "random": { 
        $lte: random 
       } 
      }).limit(1, function(err, doc) { 
       console.log('This never gets called'); 
       Images.push(doc); 
      }); 

    } 
    callback(err, Images); 

回答

0

您的while循环实际上是一个无限循环,因为只要循环正在运行,就不能调用find回调函数,并且循环只在足够的回调函数运行后退出。

另外,limit将光标传递给回调函数,而不是doc,所以您应该使用findOne来代替。

你需要重写它是这样的:

var imagesCollection = db.collection('Images'); 
var Images = new Array(); 

for (var i=0; i<quantity; i++) { 
    var random = Math.random(); 
    imagesCollection.findOne({ 
     "audioFiles.audioLanguage": audioLanguage, 
     "random": { 
      $lte: random 
     } 
    }, function(err, doc) { 
     if (Images.push(doc) === quantity) { 
      callback(err, Images); 
     } 
    }); 
} 
+0

这似乎是将同一个doc反复推入数组,而不是执行n次查询并将每个结果推送到数组中。循环能否比查询操作更快完成? – hughesdan 2013-02-23 05:18:57

+0

@hughesdan循环将在第一次回调被调用之前完成,但这是预期的。如果同一文档被多次推送,则可能是这个“随机”部分的问题。 – JohnnyHK 2013-02-23 05:25:22

+0

我很确定随机部分作品。似乎正在发生的事情是查询的第一次触发的结果在查询返回的下一次触发之前被多次推入到数组中。不过,我认为你已经回答了有关while循环的原始问题。我会接受你的回答。 – hughesdan 2013-02-23 05:40:30

0
quantity 

var quantity = 10; //declare variable to whatever number it needs to be 
var imagesCollection = db.collection('Images'); 
var Images = new Array(); 

while(Images.length < quantity) { 
//rest of code here... 

看看是否能帮助你的。

+0

这不是问题。数量在我的代码中的其他地方声明。我只是没有在上面显示。 – hughesdan 2013-02-23 05:20:56

相关问题