MongoDB:将集合合并到单个文档中
我正在寻找一些关于连接的信息,以及它们在MongoDB:将集合合并到单个文档中,mongodb,nosql,aggregation-framework,Mongodb,Nosql,Aggregation Framework,我正在寻找一些关于连接的信息,以及它们在MongoDB中的行为。虽然我理解NoSQL数据库背后的巨大功能是将所有信息存储在文档中,并且该文档包含尽可能多的信息,这样您就不必进行多次查询 不过,我也了解到,在某些情况下,您可能希望最大限度地减少数据重复,从而最大限度地降低一致性问题的风险 使用文档引用时,是否有方法返回单个文档?我尝试了$lookup函数,虽然它确实返回了正确的结果,但它为每个数组条目返回一个文档 假设结构如下: 客户: { _id: ObjectId("578d70691
MongoDB
中的行为。虽然我理解NoSQL数据库背后的巨大功能是将所有信息存储在文档中,并且该文档包含尽可能多的信息,这样您就不必进行多次查询
不过,我也了解到,在某些情况下,您可能希望最大限度地减少数据重复,从而最大限度地降低一致性问题的风险
使用文档引用时,是否有方法返回单个文档?我尝试了$lookup
函数,虽然它确实返回了正确的结果,但它为每个数组条目返回一个文档
假设结构如下:
客户:
{
_id: ObjectId("578d706916f07969c4b0cad1"),
name: "fred",
orders: [ObjectId("578d706916f07969c4b0cad2"),ObjectId("578d706916f07969c4b0cad3")]
}
订单:
{
_id: ObjectId("578d706916f07969c4b0cad2"),
date: xxxx,
items: [a,b,c,d]
},
{
_id: ObjectId("578d706916f07969c4b0cad2"),
date: xxxx,
items: [x,y,z]
}
使用查找,我可以得到两个文档的结果,每个订单一个文档,并附加客户数据,但是我要查找一个带有数组或订单信息的文档-一个嵌入文档
。i、 e.以下结构
{
_id: ObjectId("578d706916f07969c4b0cad1"),
name: "fred",
orders: [
{
_id: ObjectId("578d706916f07969c4b0cad2"),
date: xxxx,
items: [a,b,c,d]
},
{
_id: ObjectId("578d706916f07969c4b0cad2"),
date: xxxx,
items: [x,y,z]
}]
}
这在
MongoDB
中是否可能?或者,join
过程是否与SQL数据库非常匹配,以至于在尝试加入数据时总是返回重复的客户信息?我知道数据可以在应用程序(如节点
中)中转换为单个文档,但是从查询的编写方式来看,是否有可能返回预格式化的数据?您可以执行单个聚合
以获得该结果。mongo$lookup
文档的一部分显示
鉴于以下收集:
db.user.insert({
name: "fred",
orders: [ObjectId("578d706916f07969c4b0cad2"),ObjectId("578d706916f07969c4b0cad3")]
})
db.order.insert({
_id: ObjectId("578d706916f07969c4b0cad2"),
date: ISODate("2012-12-20T06:01:17.171Z"),
items: ["a","b","c","d"]
})
db.order.insert({
_id: ObjectId("578d706916f07969c4b0cad3"),
date: ISODate("2012-12-19T06:01:17.171Z"),
items: ["x","y","z"]
})
使用以下各项执行聚合
:
您的$unwind
数组订单
用于$lookup
字段上的
集合订单
新创建的$unwind
包含已查找项目的字段订单
按$group
将您的\u id
项目重新组合在一个数组中,不重复订单
db.user.aggregate([{
$unwind: "$orders"
}, {
$lookup: {
from: "order",
localField: "orders",
foreignField: "_id",
as: "orders"
}
}, {
$unwind: "$orders"
}, {
$group: {
_id: "$_id",
name: {
$first: "$name"
},
orders: {
$addToSet: "$orders"
}
}
}])
这将为您提供:
{
"_id": ObjectId("5798a8e1968539bb0a98d1c3"),
"name": "fred",
"orders": [{
"_id": ObjectId("578d706916f07969c4b0cad3"),
"date": ISODate("2012-12-19T06:01:17.171Z"),
"items": ["x", "y", "z"]
}, {
"_id": ObjectId("578d706916f07969c4b0cad2"),
"date": ISODate("2012-12-20T06:01:17.171Z"),
"items": ["a", "b", "c", "d"]
}]
}