<p>你把条件混在一起了。您突出显示的文档部分指的是写入确认,而不是更新的文档数。在</p>
<p>简而言之,当驱动程序向MongoDB发送一个write命令并且您拥有默认的写确认(<code>w=1</code>),如果MongoDB不确认更新完成成功,驱动程序将抛出<code>OperationFailure</code>错误。您可以在<a href="http://docs.mongodb.org/manual/core/write-concern/#acknowledged" rel="nofollow">MongoDB pages</a>上阅读有关它的更多详细信息。在</p>
<p>您的两个更新实际上都是成功的(MongoDB确认更新已应用)。这就是你没有出错的原因。你的问题是你的更新查询实际上没有更新任何文档。在</p>
<p>如果您在MongoDB shell v2.6+中执行此更新,而实际上没有修改任何文档,则会得到如下结果:</p>
<pre><code>WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
</code></pre>
<p>实际更改文档的更新结果如下所示:</p>
^{pr2}$
<p><strong>编辑:</strong></p>
<p>我使用的是安装在Ubuntu上的旧版本pymongo(2.6.3)和<code>apt-get</code>并且我得到了与您相同的更新查询响应。在</p>
<p>我删除了python pymongo包,并使用<code>pip</code>更新到pymongo的最新版本。我从修改文档的更新中得到以下响应:</p>
<pre><code>{'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1}
</code></pre>
<p>我在MongoDB 2.6上测试过这个。使用此代码。在</p>
<pre><code>from pymongo import MongoClient
m = MongoClient('localhost', 27017)
db = m.test
print db.test.update({}, {'$pull': {'a' : 1}})
</code></pre>
<p><strong>编辑2</strong></p>
<p>那是因为你使用的是MongoDB 2.4。如果您在MongoHQ上使用沙盒/免费版本,那么您目前无法更改(<a href="http://support.mongohq.com/getting-started/mongodb-version.html" rel="nofollow">link</a>)。在</p>
<p>MongoDB 2.6在对update命令的响应中返回<code>updatedExisting</code>字段(这对您很重要)。我怀疑这是因为v2.6版本中更改了写入协议:</p>
<blockquote>
<p>A new protocol for write operations integrates write concerns with the
write operations, eliminating the need for a separate getLastError
command. Write methods now return the status of the write operation,
including error information.</p>
</blockquote>