MongoDB中的三重关系查找
我试图解决这个问题,但它超出了我的蒙哥技能水平。 我希望有一些铁杆的蒙哥巫师有一个想法:-) 我想在哪里得出一个结果MongoDB中的三重关系查找,mongodb,Mongodb,我试图解决这个问题,但它超出了我的蒙哥技能水平。 我希望有一些铁杆的蒙哥巫师有一个想法:-) 我想在哪里得出一个结果 db.getCollection('invoice').find({ dueDate: { $gte:148000000, $lt: 149000000 } }) 这是“发票”表 invoice { "_id" : "KLKIU", "invoiceNumber" :
db.getCollection('invoice').find({
dueDate: {
$gte:148000000,
$lt: 149000000
}
})
这是“发票”表
invoice
{
"_id" : "KLKIU",
"invoiceNumber" : 1,
"bookingId" : "0J0DR",
"dueDate" : "148100000",
"account" : "aaaaaaaaaa",
"invoiceLines" : [
{
"lineText" : "Booking fee",
"amount" : 1000
},
{
"lineText" : "Discount",
"amount" : -200
},
{
"lineText" : "Whatever extra",
"amount" : 400
}
]
}
这就是结果
{
"_id" : "KLKIU",
"invoiceNumber" : 1,
"bookingId" : "0J0DR",
"dueDate" : "148100000",
"account" : "aaaaaaaaaa",
"invoiceLines" : [
{
"lineText" : "Booking fee",
"amount" : 1000
},
{
"lineText" : "Discount",
"amount" : -200
},
{
"lineText" : "Whatever extra",
"amount" : 400
}
],
"propertyName" : "Atlantis Condo",
}
请注意底部的“propertyName”
它需要查找和添加
“地产名称”:“亚特兰蒂斯公寓”,
这将是这样做的
db.getCollection('booking').find({
booking._id: invoice.bookingId
})
然后
db.getCollection('property').find({
property._id: booking:propertyId
})
以下是两个表格:
Booking
{
"_id" : "0J0DR",
"propertyId" : "58669471869659d70b424ea7",
}
Property
{
"_id" : "58669471869659d70b424ea7",
"propertyName" : "Atlantis Condo",
}
希望有人能弄明白这一点-现在我正在做一些可怕的顺序循环,而且有大量的数据,速度非常慢 您可以尝试下面的聚合
$lookup
加入Booking
和Property
收藏
db.getCollection('invoice').aggregate([{
$match: {
"dueDate": {
$gte: 148000000,
$lt: 149000000
}
}
}, {
$lookup: {
from: "Booking",
localField: "bookingId",
foreignField: "_id",
as: "booking"
}
}, {
$unwind: "$booking"
}, {
$lookup: {
from: "Property",
localField: "booking.propertyId",
foreignField: "_id",
as: "property"
}
}, {
$unwind: "$property"
}, {
$addFields: {
"propertyName": "$property.propertyName"
}
}, {
$project: {
"booking": 0
}
}, {
$project: {
"property": 0
}
}])
$unwind
将booking
数组输出从$lookup
展平,以便在本地字段上连接到属性
集合
db.getCollection('invoice').aggregate([{
$match: {
"dueDate": {
$gte: 148000000,
$lt: 149000000
}
}
}, {
$lookup: {
from: "Booking",
localField: "bookingId",
foreignField: "_id",
as: "booking"
}
}, {
$unwind: "$booking"
}, {
$lookup: {
from: "Property",
localField: "booking.propertyId",
foreignField: "_id",
as: "property"
}
}, {
$unwind: "$property"
}, {
$addFields: {
"propertyName": "$property.propertyName"
}
}, {
$project: {
"booking": 0
}
}, {
$project: {
"property": 0
}
}])
$addFields
以投影propertyName
字段
$project
从引用的集合中排除字段
db.getCollection('invoice').aggregate([{
$match: {
"dueDate": {
$gte: 148000000,
$lt: 149000000
}
}
}, {
$lookup: {
from: "Booking",
localField: "bookingId",
foreignField: "_id",
as: "booking"
}
}, {
$unwind: "$booking"
}, {
$lookup: {
from: "Property",
localField: "booking.propertyId",
foreignField: "_id",
as: "property"
}
}, {
$unwind: "$property"
}, {
$addFields: {
"propertyName": "$property.propertyName"
}
}, {
$project: {
"booking": 0
}
}, {
$project: {
"property": 0
}
}])
你的mongo版本是什么?所有的关系都是一对一的?@Veeram-我有最新的Mongo版本3.4-是的,关系是一对一的。这意味着预订。_id是唯一的和属性。_id是唯一的谢谢!!我在那里学到了很多——甚至不知道$project命令。我还有一个问题,db.getCollection('invoice').aggregate([{dueDate:{$gte:('2017-01-01T00:00:00.000Z”),$lt:('2017-03-01T00:00:00.000Z”)}}}),这给了我断言:命令失败:{“确定”:0,“errmsg:“无法识别的管道阶段名称:'dueDate',“代码”:16436}:聚合失败(顺便说一句,我的mongodb服务器版本是3.2.12-这就是你认为的原因吗?升级能解决问题吗?)不客气。我已经更新了该问题的答案。它缺少
$match
。如果您使用的是3.2.12,则该代码将不起作用。如果您有机会,请升级。$addFields
阶段仅在3.4中可用。查找“非常有效”,但“聚合”给出了“无法识别的管道阶段名称”啊,好的-谢谢-我明天会升级sysadm:)再一次-谢谢一堆Veeram-一切都很好!!这教会了我如何优化我的许多其他GET:-)