MongoDB文件计数波动

我在集合中面临 document </ code>计数的问题</ 代码>稍微不稳定。</ p>

这是我的工作流程:</ strong> </ p>

首先使用 scrapy 。 Scraped项目通过管道</ code>发送,并准备使用 pymongo </ code>库写入集合</ code>。</ p>

接下来,检查项目当前是否存在(使用密钥),如果是,则继承 _id </ code>并使用 db.collection.save()</ code>来实现 <代码> UPSERT </代码>。 进行检查以确保在写入之前存在所有字段</ code>。 </ p>

如果该项目不存在,则在集合</ code>中创建一个新的 document </ code>。</ p>

< p>最后,前端 PHP </ code>网页允许用户使用 PHP mongoDB驱动程序</ code>在集合</ code>中搜索 documents </ code> 。</ p>

问题</ strong> </ p>

我开始在网页上注意到一些新文档会在一次抓取中出现,然后从 突然看到,然后在下一次爬行后神秘地再次出现。 所以我进入 mongo shell </ code>,发现如果重复发送,特定查询将返回波动的结果数。 类似于一个然后下降两个然后回到稳定数字的东西。 </ p>

我没有得到的是,代码中的任何一点都不是 remove()</ code>来自<的文档</ code> 代码>集合</代码>。 我的印象是 db.collection.save()</ code>只会导致集合中的文档数量相等或越来越多。 </ p>

是否存在某种形式的阻止,无法查询正在编写的文档? 或者它与我的抓取间隔有什么关系?</ p>

注意:</ strong> </ p>


  • 没有索引 在集合上完成</ li>
  • 每个抓取+写入过程只需要大约5-10秒,并在30秒间隔内重复。</ li>
    </ ul>

    代码 查询片段:</ p>

      $ cursor = $ collection-&gt; find(array('$ or'=&gt; array(
    array)''post_content'=&gt; 新的MongoRegex(“/ $ safe / i”)),
    array('post_user'=&gt; new MongoRegex(“/ ^ $ safe $ / i”))
    )));
    $ cursor-&gt; sort(array('post_datetime'=&gt; -1));
    </ code> </ pre>
    </ div>

展开原文

原文

I am facing an issue with the document count in a collection being slightly erratic.

Here is my workflow:

Crawling is first done with scrapy. Scraped items are sent through a pipeline and prepared for writing to the collection using pymongo library.

Next, perform a check to see if the item currently exists (using a key) and if so, inherit the _id and use db.collection.save() to achieve an upsert. A check is done to ensure that all fields exist before writing.

If the item does not exist, a new document is created in the collection.

Lastly, a frontend PHP webpage allows users to search for documents in the collection using the PHP mongoDB driver.

Issue

I started noticing on the webpage that some new documents would appear in one crawl, then disappear from view suddenly, and then mysteriously appear again after the next crawl. So I went into mongo shell and found that a specific query would return a fluctuating number of results if sent repeatedly. Something like up by one and then down by two and then back to a stable number.

The thing I don't get is that at no point in the code do I remove() any documents from the collection. My impression is that db.collection.save() will only result in an equal or increasing number of documents in the collection.

Is there some form of blocking whereby documents being written cannot be queried? Or does it have something to do with my crawling interval?

Notes:

  • No indexing is done on the collection
  • Each crawl+write process only takes about 5-10s and are repeated in 30s interval.

Code snippet of the query:

    $cursor = $collection->find(array( '$or' => array(
            array('post_content' => new MongoRegex("/$safe/i")),
            array('post_user' => new MongoRegex("/^$safe$/i"))
    )));
    $cursor->sort(array('post_datetime' => -1));

douwen2072
douwen2072 再次感谢您提供的许多提示。也许你可以将它们编译成一个答案,如果方向确实正确,我可以接受答案。
5 年多之前 回复
dsjws44266
dsjws44266 不,它不是开箱即用,你必须设置它。你在运行什么版本的mongodb?阅读并发(锁定)页面docs.mongodb.org/manual/administration/production-notes/#mmapv1(mmapv1是默认值)。希望它可以提供更多提示。
5 年多之前 回复
donglang2010
donglang2010 这是开箱即用的吗?我没有有意识地做这样的设置。但是感谢提示,我会检查确实是这个问题。
5 年多之前 回复
dongli564510
dongli564510 嗨,您在设置中使用mongo副本(主要/次要)吗?可能是你的查询命中了一个过时的奴隶。然后,由于最终一致的性质,您会看到稳定的计数?
5 年多之前 回复
dongzhouji4021
dongzhouji4021 需要注意的一点是,当其中一个文档被更新和爬行时,通常会发生波动(不会增加文档数量,只需更改字段的值.db.collection.save()用于进行插入。更改不是查询条件中使用的。
5 年多之前 回复
dongxian1699
dongxian1699 谢谢回复。我添加了PHP代码段。我在mongoDB之外进行计数。如您所见,这是一个非常简单的查询。
5 年多之前 回复
dongxing1965
dongxing1965 嗨,什么是“特定查询”会返回波动的结果数?有兴趣看看这个查询有多复杂,或者你指的是简单的collection.count()干杯。
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐