java mongodb cursor_在java中使用mongodb游标(DBCursor)的罕见行为,即使已经到达最后一个元素...

我有一个名为MyCollection的集合,它在mongodb中的bd MyDB中包含200个元素

> use MyDB

switched to db MyDB

> db.MyCollection.count()

200

即使以我用来加载光标并迭代它的不同方式,我也得到了一种非常罕见的行为,这是我的代码:

DBCollection collection = getCollection("MyBD", "MyCollection");

DBCursor cursor = collection.find();

//DBCursor cursor = collection.find().limit(200);

System.out.println("Cursor length: "+cursor.length());

Iterator itrc = cursor.iterator();

//while(cursor.hasNext()){

while (itrc.hasNext()) {

//DBObject obj = (DBObject)cursor.next();

DBObject obj = (DBObject)itrc.next();

//BSONObject obj2 = (BSONObject)obj.get("scores");

Integer intg = (Integer) obj.get("_id");

System.out.println("_id:"+intg.toString());

// operations remove and insert on the collection

// that affect the cursor behavior

BasicDBList bl = (BasicDBList) obj.get("fieldArray");

BasicDBObject bdo = new BasicDBObject();

bdo.put("fieldArray", bl);

Integer intid = (Integer) obj.get("_id");

bdo.put("_id", intid);

String str = (String) obj.get("fieldString");

bdo.put("fieldString", str);

collection.remove(obj);

obj=null;

collection.insert(bdo);

if(intg.intValue()==199){

System.out.println("Reached: "+intg.intValue());

}

}

这是输出:

Cursor length: 200

_id:0 _id:1 _id:2 _id:3 _id:4 _id:5 _id:6 _id:7 _id:8 _id:9 _id:10 _id:11 _id:12 _id:13 _id:14 _id:15 _id:16 _id:17 _id:18 _id:19 _id:20 _id:21 _id:22 _id:23 _id:24 _id:25 _id:26 _id:27 _id:28 _id:29 _id:30 _id:31 _id:32 _id:33 _id:34 _id:35 _id:36 _id:37 _id:38 _id:39 _id:40 _id:41 _id:42 _id:43 _id:44 _id:45 _id:46 _id:47 _id:48 _id:49 _id:50 _id:51 _id:52 _id:53 _id:54 _id:55 _id:56 _id:57 _id:58 _id:59 _id:60 _id:61 _id:62 _id:63 _id:64 _id:65 _id:66 _id:67 _id:68 _id:69 _id:113 _id:101 _id:102 _id:103 _id:104 _id:105 _id:106 _id:107 _id:108 _id:109 _id:110 _id:111 _id:112 _id:114 _id:115 _id:116 _id:117 _id:118 _id:119 _id:120 _id:121 _id:122 _id:123 _id:124 _id:125 _id:126 _id:127 _id:128 _id:129 _id:130 _id:131 _id:132 _id:133 _id:134 _id:135 _id:136 _id:137 _id:138 _id:139 _id:140 _id:141 _id:142 _id:143 _id:144 _id:145 _id:146 _id:147 _id:148 _id:149 _id:150 _id:151 _id:152 _id:153 _id:154 _id:155 _id:156 _id:157 _id:158 _id:159 _id:160 _id:161 _id:162 _id:163 _id:164 _id:165 _id:166 _id:167 _id:168 _id:169 _id:170 _id:171 _id:172 _id:173 _id:174 _id:175 _id:176 _id:177 _id:178 _id:179 _id:180 _id:181 _id:182 _id:183 _id:184 _id:185 _id:186 _id:187 _id:188 _id:189 _id:190 _id:191 _id:192 _id:193 _id:194 _id:195 _id:196 _id:197 _id:198 _id:199

***************************

Reached: 199

***************************

_id:70 _id:71 _id:72 _id:73 _id:74 _id:75 _id:76 _id:77 _id:78 _id:79 _id:80 _id:81 _id:82 _id:83 _id:84 _id:85 _id:86 _id:87 _id:88 _id:89 _id:90 _id:91 _id:92 _id:93 _id:94 _id:95 _id:96 _id:97 _id:98 _id:99 _id:100_id:96 _id:97 _id:98 _id:99 _id:100

正如它所看到的,一旦达到200个元素的限制(元素_id:199),它就跳转到带有_id:70的元素,然后它重复31次额外的迭代,直到达到元素_id:100,而不是在适合200次迭代的时间.

替代方案:一个在代码中注释(使用游标的方法:hasNext()),另一个正在运行的(使用Iterator)都具有相同的输出.

如果我删除集合上的操作部分(在我的情况下删除/插入),则不会发生罕见的行为.

这是预期的输出:

Cursor length: 200

_id:0 _id:1 _id:2 _id:3 _id:4 _id:5 _id:6 _id:7 _id:8 _id:9 _id:10 _id:11 _id:12 _id:13 _id:14 _id:15 _id:16 _id:17 _id:18 _id:19 _id:20 _id:21 _id:22 _id:23 _id:24 _id:25 _id:26 _id:27 _id:28 _id:29 _id:30 _id:31 _id:32 _id:33 _id:34 _id:35 _id:36 _id:37 _id:38 _id:39 _id:40 _id:41 _id:42 _id:43 _id:44 _id:45 _id:46 _id:47 _id:48 _id:49 _id:50 _id:51 _id:52 _id:53 _id:54 _id:55 _id:56 _id:57 _id:58 _id:59 _id:60 _id:61 _id:62 _id:63 _id:64 _id:65 _id:66 _id:67 _id:68 _id:69 _id:113 _id:101 _id:102 _id:103 _id:104 _id:105 _id:106 _id:107 _id:108 _id:109 _id:110 _id:111 _id:112 _id:114 _id:115 _id:116 _id:117 _id:118 _id:119 _id:120 _id:121 _id:122 _id:123 _id:124 _id:125 _id:126 _id:127 _id:128 _id:129 _id:130 _id:131 _id:132 _id:133 _id:134 _id:135 _id:136 _id:137 _id:138 _id:139 _id:140 _id:141 _id:142 _id:143 _id:144 _id:145 _id:146 _id:147 _id:148 _id:149 _id:150 _id:151 _id:152 _id:153 _id:154 _id:155 _id:156 _id:157 _id:158 _id:159 _id:160 _id:161 _id:162 _id:163 _id:164 _id:165 _id:166 _id:167 _id:168 _id:169 _id:170 _id:171 _id:172 _id:173 _id:174 _id:175 _id:176 _id:177 _id:178 _id:179 _id:180 _id:181 _id:182 _id:183 _id:184 _id:185 _id:186 _id:187 _id:188 _id:189 _id:190 _id:191 _id:192 _id:193 _id:194 _id:195 _id:196 _id:197 _id:198 _id:199

***************************

Reached: 199

***************************

>操作删除/插入如何以我之前暴露的方式影响游标行为?

>我该如何使用快照选项?

>提前思考,如果我需要使用有序集合呢?

顺便说一句,如果我使用没有迭代器的选项,就像这样:

while(cursor.hasNext()){

DBObject obj = (DBObject)cursor.next();

>为什么我要删除下一行?

System.out.println(“Cursor length:”cursor.length());

为了避免下一个异常:

Exception in thread "main" java.lang.IllegalArgumentException: can't switch cursor access methods

at com.mongodb.DBCursor._checkType(DBCursor.java:412)

at com.mongodb.DBCursor.hasNext(DBCursor.java:483)

at tasks.UpdateRemoveHW.main(Test.java:56)

解决方法:

只是抛出异常IllegalArgumentException,然后你得到DBCursor.length()的使用已经将curser转换为数组.之后使用hasnext(),接下来是非法的.如果你想在迭代之前更好地使用hasnext()或next()来删除length().

标签:java,mongodb,cursor

来源: https://codeday.me/bug/20190620/1244956.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值