1
zyy1245367562 OP 怎么没有前辈来指教一下呢?
|
2
tosexxx 2017-12-03 15:09:52 +08:00
大佬都在度假,没空 8 小时之外看 v 站
|
3
SO647898 2017-12-03 15:16:03 +08:00 via Android
大佬都在度假,没空 8 小时之外看 v 站
|
4
kenzh 2017-12-03 15:27:51 +08:00 1
看了下文档,find()总是返回的是 Cursor, 猜测应该用 db.mycollection.find({"ip":item["ip"]}).count() 吧。
|
5
golmic 2017-12-03 15:29:52 +08:00 via Android
用 upsert
|
6
swulling 2017-12-03 16:19:44 +08:00 via iPad
|
7
brickyang 2017-12-03 19:38:17 +08:00 via iPhone 1
.find() 返回的是 cursor,用 find().toArray() 返回的是查找结果的数组,如果不存在就是个空数组。
你也可以试试 .findOneAndUpdate() 并设置 upsert: true,这样如果找到记录则更新(更新内容为空),找不到则新建一条记录。 |
8
fds 2017-12-03 20:00:39 +08:00 1
返回的是 cursor,肯定为 True 呀,你得调用.next()才可能获得一个空结果吧。
另外,这种约束条件一般是这样实现:在 ip 上建立一个 unique 的索引,然后每次都直接插入;如果已有,则会报错 duplicate,忽略即可。你这种 ifelse 不是“原子”操作,如果有多个进程同时工作,可能插入多条相同 ip 的。 |
9
livexia 2017-12-03 21:32:11 +08:00
find_one
|
10
lihongjie0209 2017-12-03 21:38:37 +08:00 1
动态语言就是有这个问题
如果你需要集合为空: 那么使用 if collection.isEmpty 或者是 if collection.size() == 0 如果你需要集合为 null/none: 那么使用 if collection== null/none 这样写代码的时候意图清楚, 看代码的人也轻松. |
11
zyy1245367562 OP @kenzh 你的建议可以实现。谢谢。
|
12
zyy1245367562 OP @fds 嗯,你说的对,这一点确实没有考虑到。
|
13
zyy1245367562 OP @lihongjie0209 嗯,受教了。谢谢前辈。
|
14
toono 2017-12-06 09:03:17 +08:00
find 方法返回的都是集合对象。
下面我的实际代码,是需要先把查询回来的结果对象使用 count 方法去查看具体数量 def process_item(self, item, spider): result = self.db[self.mongo_collection].find({'source_url': item['source_url']}) if result.count() != 0: raise DropItem("Duplicate item found: %s" % item) else: return item |