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_Nosql_Aggregation Framework - Fatal编程技术网

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"]
    }]
}