使用pymongo

时间:2017-07-10 10:54:22

标签: 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')}

现在我想查询“名称”为“pqr”的文档,并且其先前/链接文档应包含“label”作为“actionA”。 我想要的是它应该找到'name'并检查以前喜欢的doc是否可用,如果是,那么检查它以前的doc应该有我想要的'label'。 如果使用一些类似命令的话会更好:

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

2 个答案:

答案 0 :(得分:1)

您可以使用聚合

来实现这一目标

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

  1. 过滤掉 name != 'pqr' 阶段中$match的文档
  2. 通过 $lookup
  3. 将孩子与父母联系起来
  4. 使用 $unwind
  5. 展开结果数组
  6. 最后过滤掉parent.label != 'actionA'
  7. 所在的文档

    这是查询:

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

答案 1 :(得分:0)

您也可以在引用的文档(NoSQL方式)中对auto_label进行非规范化和存储。

render() {
    const { state, goBack } = this.props.navigation;    
    const params = state.params || {};

    return (
        <View>
            <Button title="Back to Cover" onPress={ () => {
                /* go back from *EditCover* to *Cover* */
                goBack(params.go_back_key);
            }} />
        </View>
    );
}

然后您可以对结果使用查询查询

{'_id':1, 'name':'abc', 'label':'actionA', 'prev':null}
{'_id':2, 'name':'pqr', 'label':'actionB', 'prev':ObjectId('1'),'prev_label': 'actionA'}
{'_id':3, 'name':'xyz', 'label':'actionC', 'prev':ObjectId('2'),'prev_label': 'actionB'}

如果更改了原始文档中的标签,您可以使用更新查询在参考文档中更新它们

db.collection.find({'$and'[{'name':'pqr'},{'prev_label': 'actionA'}]})