我有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'})}]})
答案 0 :(得分:1)
您可以使用聚合
来实现这一目标利用 $graphLookup
运算符:
db.collection.aggregate([
{
$match:{
"name":"pqr"
}
},
{
$graphLookup:{
from:"collection",
startWith:"$prev",
connectFromField:"prev",
connectToField:"_id",
as:"parent",
maxDepth:1,
restrictSearchWithMatch:{
label:"actionA"
}
}
}
])
name != 'pqr'
阶段中$match
的文档$lookup
$unwind
parent.label != 'actionA'
这是查询:
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'}]})