V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
Neagle
V2EX  ›  MongoDB

请教下 关于判断 field 里面 vaule 是否存在,存在则忽略,不存在则插入 怎么判断,谢谢。

  •  
  •   Neagle · 2016-06-15 12:51:16 +08:00 · 4292 次点击
    这是一个创建于 3065 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大叫好,小弟我刚学习 mongodb ,过了一遍官方文档,我目前在做一个爬虫,爬取的信息存入文档,每个文档中有一个 field 是 from_url, 然后把这个文档信息的来源 url 存入。问题是,我以后爬取的时候,需要判断下是否已经存入过了,如果存入过这个 url 就放弃,没存入就爬取内容后进行存入。
    刚学,不是很明白,请指教。谢谢
    9 条回复    2016-06-20 15:02:52 +08:00
    kxxoling
        1
    kxxoling  
       2016-06-15 13:06:40 +08:00   ❤️ 1
    你要的是 `db.collections.yourCollection.find({from_url: {$eq: url}})`?
    gzlock
        2
    gzlock  
       2016-06-15 13:07:34 +08:00 via Android
    gg 搜 MongoDB exists 有很多结果
    Neagle
        3
    Neagle  
    OP
       2016-06-15 13:14:38 +08:00
    @gzlock 谢谢我使用 infos = db.test.find({"url":{"$exists":True}}) 只能找到存在 url 字段的文档,我想要的是 每个 url 字段里面 value 值是否已经存在了,谢谢。 难道要把 url 字段存在的文档全部返回 在到程序里面去判断?
    gzlock
        4
    gzlock  
       2016-06-15 13:22:24 +08:00 via Android
    @Neagle 那就用 count ,搜一个 URL 结果为零就等于没有爬过
    doublleft
        5
    doublleft  
       2016-06-15 14:52:22 +08:00   ❤️ 1
    其实仔细想一下,考虑这个问题有两个点:
    1.原子性
    2.单次查询次数

    如果按照你说的方式:先查询这个是否存在,然后在写入。显然以上 2 个问题都是不满足的。

    哦……我是这样实现的,表里加一个 hash 字段,存除了 id 之外所有的值的 crc32 值,做唯一索引。
    这样每次新增的时候就直接写就好了:如果存在肯定会写失败,不存在一次写入,而且满足原子性。
    Neagle
        6
    Neagle  
    OP
       2016-06-15 19:16:06 +08:00
    @doublleft 感谢回复,的确是这两个问题, mongodb 没有更简单的办法? 或者说我就把 from_url 作唯一索引,用的时候直接写? 如果存在,就写失败,如果不存在则一次性写入?
    doublleft
        7
    doublleft  
       2016-06-15 20:50:41 +08:00
    @Neagle url 不定长的, 所以建议还是哈希一下吧.
    Neagle
        8
    Neagle  
    OP
       2016-06-16 22:50:32 +08:00
    @doublleft 谢谢,您的意思是 我把 url 字段 哈希后存入,做唯一索引,然后写的时候直接写,存在则失败,不存在则写入?
    onion83
        9
    onion83  
       2016-06-20 15:02:52 +08:00
    可以研究下 findAndModify
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3090 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:48 · PVG 21:48 · LAX 05:48 · JFK 08:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.