收藏馆:
{
"_id": ObjectId('0001'),
"fruit": "apple",
"entries": [
DBRef('room', ObjectId('1234')),
DBRef('room', ObjectId('5678'))
]
}
收藏室:
{
"_id": ObjectId('1234'),
"some": "data"
}
我现在想要所有房间的正常输出(简单查找),但丰富了一个水果数组,其中包含包含房间的房屋的所有水果(数组,因为一个房间可能位于多个房屋中),例如:
[
{
"some": "data",
"fruits": ["apple"]
}
]
所以我尝试聚合房间,对房子进行查找,但由于我需要搜索数组,所以我无法使用正常的查找,而是使用管道查找。在管道中,我需要创建一些匹配,但在其中(使用映射)我无法从 DBRef 中获取该死的 ObjectId。我知道,DBRef 显然已经过时了,但它是我们现在拥有的数据库,我需要使用。
有什么帮助吗? DB 版本为 4.0.22
具有“实际”解决方案的游乐场: https://mongoplayground.net/p/HUm05wtOsMJ
数据:
db={
"houses": [
{
"_id": 1001,
"fruit": "apple",
"dummy": "ignoreMe",
"rooms": [
{
$ref: "rooms",
$id: ObjectId("1bcdefbcdefbcdefbcdefbcd")
},
{
$ref: "rooms",
$id: ObjectId("2bcdefbcdefbcdefbcdefbcd")
}
]
},
{
"_id": 1002,
"fruit": "pear",
"dummy": "ignoreMe",
"rooms": [
{
$ref: "rooms",
$id: ObjectId("2bcdefbcdefbcdefbcdefbcd")
},
{
$ref: "rooms",
$id: ObjectId("3bcdefbcdefbcdefbcdefbcd")
}
]
}
],
"rooms": [
{
"_id": ObjectId("1bcdefbcdefbcdefbcdefbcd"),
"description": "room 1"
},
{
"_id": ObjectId("2bcdefbcdefbcdefbcdefbcd"),
"description": "room 2"
},
{
"_id": ObjectId("3bcdefbcdefbcdefbcdefbcd"),
"description": "room 3"
}
]
}
查询:
db.rooms.aggregate([
{
"$lookup": {
from: "houses",
"let": {
id: "$_id"
},
"pipeline": [
{
$match: {
$expr: {
$in: [
"$$id",
{
$map: {
"input": "$rooms",
"as": "room",
"in": "$$room.$id"
}
}
]
}
}
},
{
$project: {
a: "$fruit"
}
}
],
"as": "houseFruits"
}
}
])
但是,它在我的现实生活示例中不起作用,因为“聚合”不适用于“DBRef”...它告诉错误的是“fieldNames”可能不包含“$”...是的,谢谢没有什么。显然此时需要使用mapReduce。
我们需要重构这个数据库。