虽然您可以forEach
用来遍历集合,但您最终会跳过所有其他索引。
游标只是结果集中的一个位置。forEach
通常将当前移动到下一个项目,但是通过next
手动调用光标实例,您可能会无意中跳过集合。
> db.states.remove()
> db.states.insert({name: "alabama"})
> db.states.insert({name: "alaska"})
> db.states.insert({name: "arkansas"})
> db.states.insert({name: "wisconsin"})
> db.states.insert({name: "west virginia"})
然后,初始化游标:
> var cursor=db.states.find();
如果我使用forEach
and next
:
> cursor.forEach(function(item){
print("name: " + item.name);
print("next name: " + cursor.next().name); })
结果是:
name: alabama
next name: alaska
name: arkansas
next name: wisconsin
name: west virginia
Sun Aug 25 15:04:12.197 error hasNext: false at src/mongo/shell/query.js:124
如您所见,光标在集合中移动,然后,由于未使用,它超出集合的长度hasNext
一步。
您需要更改逻辑以实际阅读“下一个”文档,并且不让它影响以下forEach
循环迭代。
虽然我不了解您的数据的性质,但您可以执行以下操作:
> var doc=cursor.hasNext() ? cursor.next() : null;
> while(doc) {
var currentDoc=cursor.hasNext() ? cursor.next() : null;
if(currentDoc && currentDoc.name === doc.name) {
print("matched: " + currentDoc.name);
}
doc = currentDoc;
}
它获取一个文档,然后抓取下一个文档(如果有的话)并将其与第一个文档进行比较。然后,通过将先前文档与当前文档进行比较来重复。循环直到没有更多文档。
如果您的逻辑变得更复杂,我强烈建议您尝试使用 Node.JS 和本机 MongoDB 驱动程序。
此外,如果您的结果超过 20 个,则可能需要将批量大小设置为更大的数字。见这里。