为什么此代码有效并雄辩地创建子文档(如果它不存在)?



假设我有一个名为ParrentObj的集合和一个名为ParrentObj的相应Eloquent 类:

[//ParentObj eloquent objects
{
"_id":ObjectId("5e11ae242cb48f79afcd4b07"),
"Code":"a"
"Children":[
//children eloquent objects
{
"Code":"a-a",
"GrandChildren":[
//GrandChildren eloquent objects
{
"Code":"a-a-a"
},
{
"Code":"a-a-b"
}
]           
},
{
"Code":"a-b",
"GrandChildren":[
]           
}
],
},
{
"_id":ObjectId("5e11b125e1f94bccca6784e9"),
"Code":"b"
"Children":[
]
}]

我很惊讶这行代码是如何正常工作的,因为所有证据都表明它不利:

$result = ParrentObj::find('5e11ae242cb48f79afcd4b07')->where('Children.Code', 'a-a')
->whereNotIn('Children.GrandChildren.Code',['a-a-a'])
->push('Children.$.GrandChildren', $arr);//results: no effect on db
$result = ParrentObj::find('5e11ae242cb48f79afcd4b07')->where('Children.Code', 'a-a')
->whereNotIn('Children.GrandChildren.Code',['a-a-c'])
->push('Children.$.GrandChildren', $arr);//results:add a GrandChildren subdocument under the a-a Children

"ParrenObj"是一个雄辩的对象,在"儿童"字段上嵌入了许多关系。

">

孩子"也是一个雄辩的对象,在孙子领域有一个"嵌入许多"的关系。(到 0 或 n 个"孙子"雄辩对象(

据我所知,查找的结果是一个雄辩的或集合,并与结果将是一个查询生成器相结合。 当我尝试获得此结果时:

$result = ParrentObj::find($id)->where('Children.Code', "a-a")->first()

结果是一个ParrentObj(雄辩的对象(。 正如我所预料的那样,"儿童"字段有两个成员(不是一个(。如何雄辩地确定->push('Children.$.GrandChildren', $arr);应该应用于哪些孩子?

它不适用于这种情况:

$result = ParrentObj::find('5e11ae242cb48f79afcd4b07')->where('Children.Code', 'a-b')
->whereNotIn('Children.GrandChildren.Code',['a-a-a'])
->push('Children.$.GrandChildren', $arr);

预期成果:

在 a-b 子文件下添加一个带有代码 a-a-a 子文档的孙子

实际结果:

不会在 a-b 下添加任何孙子,因为其中 NotIn 匹配具有相同代码但不同子代的孙子

最新更新