簡體   English   中英

pyMongo迭代帶有子項的光標對象

[英]pyMongo iterate over cursor object with subitems

下面的函數搜索帶有子項目項目的集合。 如果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"
}

檢查空的游標會更簡單嗎,如果是的話,我該怎么做?

怎么樣:

obj = next(proj, None)
if obj:

$ elemMatch僅在給定的條件與文檔匹配時才返回結果,因此您僅應從找到條件為真的位置返回游標。

由於您在查詢中使用_id並且只希望得到一個結果,所以為什么不使用findOne和捷徑一步。

新手的另一個陷阱 ,請注意,您將在此處返回整個文檔,而不是僅包含數組匹配元素的某些表示形式。 不匹配的事物將仍然存在,然后通過迭代這些期望不同的結果將使您感到悲傷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM