pyMongo使用子项迭代光标对象

时间:2014-02-02 07:43:52

标签: python mongodb pymongo

下面的函数使用子项目搜索集合。如果有一个将isManager设置为1的子项,则应返回True,否则它将始终返回False

def isMasterProject(self, pid, uid):
  masterProjects = False
  proj = self.collection.find({ "_id": uid, "projects": { '$elemMatch': { "projectId": _byid(pid), "isManager": 1 } } })
  for value in proj:
    if str(value['projects']['projectId']) == pid:
      if value['projects']['isManager'] == 1:
        masterProjects = True
  return masterProjects

_byid等同于ObjectId

似乎总是返回False。这是一个集合的例子。

{
  "_id" : ObjectId("52cf683306bcfc7be96a4d89"),
  "firstName" : "Test",
  "lastName" : "User",
  "projects" : [
    {
      "projectId" : ObjectId("514f593c06bcfc1e96f619be"),
      "isManager" : 0
    },
    {
      "projectId" : ObjectId("511e3ed0909706a6a188953d"),
      "isManager" : 1
    },
    {
      "projectId" : ObjectId("51803baf06bcfc149116bf62"),
      "isManager" : 1
    },
    {
      "projectId" : ObjectId("514362bf121f92fb6867e58f"),
      "isManager" : 1
    }
  ],
  "user" : "test.user@example.com",
  "userType" : "Basic"
}

检查空光标是否更简单?如果是,我该怎么做?

1 个答案:

答案 0 :(得分:0)

怎么样:

obj = next(proj, None)
if obj:
如果给定的条件与文档匹配,

$elemMatch应该只返回结果,因此您只应从查找中返回标准为真的光标。

由于您在查询中使用_id并且只期望得到一个结果,为什么不使用 findOne 并快捷一步。

新修饰的另一个 gotcha ,请注意你在这里返回整个文档而不是只有数组匹配元素的表示。那些不匹配的东西仍然会存在,然后通过迭代这些会产生不同的结果会让你感到悲伤。