Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB中的三重关系查找_Mongodb - Fatal编程技术网

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:-)