- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有字段相同的父记录和子记录。然而,某些字段仅在父级别设置。
父字段设置为空字符串 ("") 表示该记录是父记录。其他记录有一个指向父记录的值集,因此这些记录可以被视为子记录。
现在考虑以下记录:
{"_id": 1, parent: "", "pValue": ["a", "b", "c"], fieldA: 2},
{"_id": 2, parent: 1, "pValue": [], fieldA: 2},
{"_id": 3, parent: 1, "pValue": [], fieldA: 2},
{"_id": 4, parent: "", "pValue": ["d"], fieldA: 9},
{"_id": 5, parent: 4, "pValue": [], fieldA:2},
{"_id": 6, parent: 4,"pValue": [], fieldA: 9}
上述记录包含两个父记录,每个父记录有 2 个关联的子记录。我尝试执行的查询涉及匹配两个给定的参数。首先是 pValue 的值。一旦我得到了数组中具有特定 pValue 的所有 parent 。然后,我想要将该父记录及其所有关联的子记录与 fieldA 值相匹配。
因此,如果给定 pValue="d"且 fieldA=9 我希望光标内包含以下记录:
{"_id": 4, parent: "", "pValue": ["d"], fieldA: 9}
{"_id": 6, parent: 4, "pValue": [],fieldA: 9}
注释:
我的尝试:
cursor=self.pCollection.aggregate([
{ "$match": {"pValue":{"$in":[pCheck]}},
{ "$graphLookup" : {
"from": "pCollection",
"startWith": "$_id",
"connectFromField": "_id",
"connectToField": "parent",
"as" : "children"
}
}])
然后,我陷入了所有与父级相关联的子级作为数组的困境,而不知道如何包装它们。
最佳答案
您需要使用 $match
选择与您的查询条件匹配的文档并过滤“children”数组,添加 $addFields
阶段。
$filter
之后ing,您可以使用arrayElemAt
将项目分配给字段。
{ "$match": { "fieldA": 9, "children.fieldA": 9 } },
{ "$addFields": {
"children": {
"$arrayElemAt": [
{ "$filter": {
"input": "$children",
"as": "child",
"cond": { "$eq": [ "$$child.fieldA", 9 ] }
}},
0
]
}
}}
您的查询将产生如下内容:
{
"_id" : 4,
"parent" : "",
"pValue" : [ "d" ],
"fieldA" : 9,
"children" : { "_id" : 6, "parent" : 4, "pValue" : [ ], "fieldA" : 9 }
}
但是,只要有一点信心,您就可以获得预期的结果。
db.collection.aggregate([
{ "$graphLookup": {
"from": "collection",
"startWith": "$_id",
"connectFromField": "_id",
"connectToField": "parent",
"as" : "children"
}},
{ "$match": { "fieldA": 9, "children.fieldA": 9 } },
{ "$addFields": {
"children": {
"$arrayElemAt": [
{ "$filter": {
"input": "$children",
"as": "child",
"cond": { "$eq": [ "$$child.fieldA", 9 ] }
}},
0
]
}
}},
{ "$project": {
"children": [
"$children",
{
"_id": "$_id",
"parent": "$parent",
"pValue": "$pValue",
"fieldA": "$fieldA"
}
]
}},
{ "$unwind": "$children" },
{ "$replaceRoot": { "newRoot": "$children" } }
])
它会产生这样的东西:
{ "_id" : 6, "parent" : 4, "pValue" : [ ], "fieldA" : 9 }
{ "_id" : 4, "parent" : "", "pValue" : [ "d" ], "fieldA" : 9 }
坦白说,我不认为这是您应该在应用程序中执行的操作。第一个选项是您可以并且应该接受的。
如果你确实需要这个,我建议你create a view并查询应用程序中的 View 。
关于python - $graphLookup 管道阶段后过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41690606/
如 https://www.slideshare.net/mongodb/webinar-working-with-graph-data-in-mongodb 中所述, 幻灯片 50 可以在 View
我试图找到给定 child 的祖先。在某个时候,那个 child 的祖先姓氏改变了。我想找到给定姓氏的这个 child 的最后一位 parent 。例如: { "_id":1, "pa
我有字段相同的父记录和子记录。然而,某些字段仅在父级别设置。 父字段设置为空字符串 ("") 表示该记录是父记录。其他记录有一个指向父记录的值集,因此这些记录可以被视为子记录。 现在考虑以下记录: {
我有以下数据集: { _id: ObjectId("asdasdasd..."), dependencies: { customers: [ ObjectId("1..."
在我的文档中,我有 _id、一个 companyName 和一个赞助商(通过 _id 标识父文档)。 例如,我有第一条没有赞助商( parent )的记录 _id:607536219910ef23e8
这个问题在这里已经有了答案: MongoDB $graphLookup get children all levels deep - nested result (2 个答案) 关闭 4 年前。 我
我正在尝试使用新的 MongoDB v3.4 $graphLookup 聚合管道。我有这个简单的树集合,有一些节点和一个父 DBRef: { "_id" : ObjectId("59380657bbd
我有一个包含 50 万条记录的员工集合。每条记录都将包含以下详细信息。 mongo文档如下。 { "_id": "234463456453643563456", "name": "Mike",
我正在寻找一种在 Resful Web API 中使用 Java 实现 graphlookup 的方法。我正在尝试像 MongoDB ( https://docs.mongodb.com/v3.4/r
我最近更新到最新的 spring mongodb 1.10 以尝试新的 $graphLookup 聚合器。但是,我似乎无法指定 graphLookup 的所有参数。 具体来说,我可以成功设置 star
集合test_links中的文档看起来: { "_id" : "57:58", "from" : { "orgunitType" : "Regional", "refI
我正在管道中使用 $graphLookup 创建 View 但失败了。有人有什么想法吗? $cmd: { "create": "employee.view.list", "viewOn": "
我是一名优秀的程序员,十分优秀!