0

假设我有一些带有 field 的文档'State',我需要在下一个文档中检测它的变化。为此,我想将当前光标与next()

cursor.forEach(
        function(thisCursor){
            print('Current: '+thisCursor.State);
            print('Next: '+cursor.next().State);
        }
)

但是输出是这样的:

Current: Florida
Next: Florida
Current: New Mexico
Next: New Mexico

所以显然.next()根本不起作用。关于为什么会发生这种情况的任何想法?

谢谢

4

1 回答 1

2

虽然您可以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();

如果我使用forEachand 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 个,则可能需要将批量大小设置为更大的数字。见这里

于 2013-08-25T20:11:21.633 回答