【发布时间】:2018-05-27 12:59:31
【问题描述】:
我有一个名为 Container 的集合,其中包含一个名为 embeddedMany 的嵌入式文档数组。每个嵌入文档都引用了其他几个名为 Referenced 的文档,这些引用存储在名为 referenceMany 的数组中。文档如下所示。
{
"_id" : ObjectId("5a312337ea5cb32d30005d25"),
"embeddedMany" : [
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d24"), "myDb"),
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d23"), "myDb")
]
},
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d23"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
},
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d24"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
}
],
}
现在我需要找到所有引用某个文档的嵌入文档。比如说这个:DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")。
我需要生成的文档如下所示:
{
"_id" : ObjectId("5a312337ea5cb32d30005d25"),
"embeddedMany" : [
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d23"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
},
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d24"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
}
],
}
我读过this 非常相似的问题。所以我想我需要使用聚合并过滤 embeddedMany 字段。到目前为止,我的聚合看起来像这样:
db.Container.aggregate(
[
{
$match: {
"embeddedMany.referencedMany.$id": ObjectId("5a312337ea5cb32d30005d22")
}
},
{
$project: {
"embeddedMany": {
"$filter": {
"input": "$embeddedMany",
"as": "embedded",
"cond": {
"$eq": [
"$$embedded.referencedMany.$id",
ObjectId("5a312337ea5cb32d30005d22")
]
}
}
}
}
},
]
);
这就是我碰壁的地方。因为 MongoDB 有 outstanding bug 阻止我在 $eq 表达式中比较 $id。有人提到使用 $objectToArray 作为 hack,但我无法将其全部完成。
任何帮助将不胜感激。
【问题讨论】:
标签: mongodb aggregation-framework