【问题标题】:pyMongo iterate over cursor object with subitemspyMongo 用子项迭代光标对象
【发布时间】:2014-02-02 16:18:23
【问题描述】:

下面的函数搜索带有子项项目的集合。如果有一个将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"
}

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

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    怎么样:

    obj = next(proj, None)
    if obj:
    

    $elemMatch 应仅在给定条件与文档匹配时返回结果,因此您应仅从 find 中返回您的条件为真的光标。

    既然您在查询中使用 _id 并且只希望得到一个结果,为什么不使用 findOne 和快捷方式一步。

    另一个gotcha 对于新的启动器,请注意您在此处返回整个文档,而不是仅包含数组匹配元素的一些表示。不匹配的东西仍然存在,然后通过迭代来期待不同的结果会让你感到悲伤。

    【讨论】:

    • 完美 - 感谢您对 elemMatch 文档的参考/提醒。我完全同意 findOne 并相应地更新了我的定义和我的蹩脚的关键迭代,这似乎已经成功了。再次感谢@neil-lunn
    猜你喜欢
    • 2012-05-12
    • 2013-07-06
    • 2016-12-31
    • 1970-01-01
    • 2020-08-14
    • 2011-05-28
    • 2021-11-12
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多