Python 使用pymongo在引用/链接的MongoDB文档中查找

Python 使用pymongo在引用/链接的MongoDB文档中查找,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有3个链接文档,如: {'_id':1, 'name':'abc', 'label':'actionA', 'prev':null} {'_id':2, 'name':'pqr', 'label':'actionB', 'prev':ObjectId('1')} {'_id':3, 'name':'xyz', 'label':'actionC', 'prev':ObjectId('2')} 现在我想查询一个“name”为“pqr”的文档,并且它的上一个/链接文档应该包含“label”为“ac

我有3个链接文档,如:

{'_id':1, 'name':'abc', 'label':'actionA', 'prev':null}
{'_id':2, 'name':'pqr', 'label':'actionB', 'prev':ObjectId('1')}
{'_id':3, 'name':'xyz', 'label':'actionC', 'prev':ObjectId('2')}
现在我想查询一个“name”为“pqr”的文档,并且它的上一个/链接文档应该包含“label”为“actionA”。 我想要的是,它应该找到'名称'并检查以前喜欢的文件是否可用,如果是这样,然后检查其以前的文件应该有'标签'我想要的。 最好使用一些类似于以下的单行命令:

db.collection.find({'$and'[{'name':'pqr'},{'prev': <gotoprev>({'label':'actionA'})}]})
db.collection.find({'$and'[{'name':'pqr'},{'prev':({'label':'actionA'})}]})

您可以使用聚合来实现这一点

MongoDB 3.4解决方案 利用
$graphLookup
运算符:

db.collection.aggregate([  
   {  
      $match:{  
         "name":"pqr"
      }
   },
   {  
      $graphLookup:{  
         from:"collection",
         startWith:"$prev",
         connectFromField:"prev",
         connectToField:"_id",
         as:"parent",
         maxDepth:1,
         restrictSearchWithMatch:{  
            label:"actionA"
         }
      }
   }
])

Mongodb 3.2
  • 过滤掉
    name!='pqr'
    $match
    阶段
  • 使用
    $lookup
  • 使用
    $unwind
  • 最后过滤掉
    parent.label!='操作A'
  • 以下是查询:

     db.collection.aggregate([  
           {  
              $match:{  
                 "name":"pqr"
              }
           },
           {  
              $lookup:{  
                 from:"collection",
                 localField:"prev",
                 foreignField:"_id",
                 as:"prev"
              }
           },
           {  
              $unwind:"$prev"
           },
           {  
              $match:{  
                 "prev.label":"actionA"
              }
           }
        ])
    

    您还可以反规范化并将prev_标签存储在引用文档中(NoSQL方式)

    然后,您可以使用find查询结果

    db.collection.find({'$and'[{'name':'pqr'},{'prev_label': 'actionA'}]})
    
    如果更改了原始文档中的标签,则可以使用更新查询在引用文档中保持这些标签的更新

    db.collection.update({'prev': updatedDocumentId},{'$set': {'prev_label': newLabel}}, multi=True)
    

    我们可以有类似的版本2.4 @ FLIX?@ JigyasuTuor,没有2.4的想法,但是这个版本被贬低,因为至少2015,你应该真的认为升级到至少3.2。
    db.collection.update({'prev': updatedDocumentId},{'$set': {'prev_label': newLabel}}, multi=True)