Python 使用pymongo在引用/链接的MongoDB文档中查找
我有3个链接文档,如: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
{'_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)