在MoongoDb中合并对象数组的问题

时间:2018-08-12 21:59:59

标签: mongodb

我试图在MoongoDb中建立一个聚合采石场,该采石场将合并来自 2个不同的集合(其中一个集合为TTL类型)。我面临两个无法解决的问题。

第一期:

我想合并临时归类和永久集合的TakenSeats字段,并设置结果而不是正确的TakenSeats字段,使用底部的聚合,我设法将数组与$push运算符,但是我无法用永久文档中的TakenSeats字段替换结果字段。

第二期:

如果我的临时收藏集中没有任何文件,我怎么仍能收到永久文件?

永久收藏中的文档样本:(从一个文档中提取数据)

{
    "_id" : ObjectId("5b6b656818883ec018d1542d"),
    "showsHall" : [ 
        ObjectId("5b64cb758ad5f81a6cb7e6ae")
    ],
    "movie" : [ 
        ObjectId("5b6b614218883ec018d15428")
    ],
    "takenSeats" : [ 
        {
            "id" : 11
        }, 
        {
            "id" : 12
        }
    ],
    "showDate" : "8/14/2018",
    "showStartTime" : "3:00 PM",
    "showEndTime" : "5:00 PM",
    "creteDate" : ISODate("2018-08-08T21:49:28.020Z"),
    "__v" : 0
}

从TTL集合中:(从多个文档中提取数据)

{
    "_id" : ObjectId("5b6f35023f64851baa70c61b"),
    "createdAt" : ISODate("2018-08-11T19:12:02.951Z"),
    "showId" : [ 
        ObjectId("5b6b656818883ec018d1542d")
    ],
    "takenSeats" : [ 
        {
            "id" : 22
        }, 
        {
            "id" : 25
        }
    ]
}

这是我使用的汇总:

db.getCollection('shows').aggregate([
    { $match: { _id: ObjectId("5b6b656818883ec018d1542d") } },
    {
        $lookup: {
            from: "temp",
            localField: "_id",
            foreignField: "showId",
            as: "fromItems"
        }
    },
    { $unwind: "$fromItems" },
    { "$project": {"takenSeats": { "$setUnion": ["$takenSeats", "$fromItems.takenSeats"]}, _id: 1, showsHall: 1, movie: 1, takenSeats: 1 , showDate: 1, showStartTime: 1, showEndTime: 1 }},   
    {$unwind:"$takenSeats"},
    {$group:{_id: "$_id", takenSeats: {$push : "$takenSeats"} }}, 
])

结果:

MoonfoDb

[编辑]

我设法通过$first运算符维护我的原始数据。 但是现在我无法解决问题2(如果为null则防止结果),我尝试使用preserveNullAndEmptyArrays 在两个unwind阶段,但是结果是它推送了一个空数组。 我想要的结果是,只有在push

中有值时,它才应该push到新数组

这是我的汇总

    db.getCollection('shows').aggregate([
        { $match: { _id: ObjectId("5b6b656818883ec018d1542d") } },
        {
            $lookup: {
                from: "temp",
                localField: "_id",
                foreignField: "showId",
                as: "fromItems"
            }
        },
        { $unwind:{path:"$fromItems" ,preserveNullAndEmptyArrays:true}},
        { "$project": {"takenSeats": { "$setUnion": ["$takenSeats", "$fromItems.takenSeats"]}, _id: 1, showsHall: 1, movie: 1, showDate: 1, showStartTime: 1, showEndTime: 1 }},   
           {$unwind:{path:"$takenSeats" ,preserveNullAndEmptyArrays:true}},
,
        {$group:{
             _id: "$_id", 
             showsHall : { $first: '$showsHall' },
             movie : { $first: '$movie' },
             showDate : { $first: '$showDate' },
             showStartTime : { $first: '$showStartTime' },
             showEndTime : { $first: '$showEndTime' },
             takenSeats: {$push : "$takenSeats"} 
              }
        }      
    ]) 

这是我在临时集合中没有文档的情况下得到的结果

{
    "_id" : ObjectId("5b6b656818883ec018d1542d"),
    "showsHall" : [ 
        ObjectId("5b64cb758ad5f81a6cb7e6ae")
    ],
    "movie" : [ 
        ObjectId("5b6b614218883ec018d15428")
    ],
    "showDate" : "8/14/2018",
    "showStartTime" : "3:00 PM",
    "showEndTime" : "5:00 PM",
    "takenSeats" : [ 
        null
    ]
} 

1 个答案:

答案 0 :(得分:0)

请在此处为解决方案2添加ifNull条件

db.getCollection('shows').aggregate([
        { $match: { _id: ObjectId("5b6b656818883ec018d1542d") } },
        {
            $lookup: {
                from: "tempShows",
                localField: "_id",
                foreignField: "showId",
                as: "fromItems"
            }
        },
        { $unwind:{path:"$fromItems" ,preserveNullAndEmptyArrays:true}},
        { "$project": {"takenSeats": { $ifNull: [{ "$setUnion": ["$takenSeats", "$fromItems.takenSeats"]}, '$takenSeats'] } ,_id: 1, showsHall: 1, movie: 1, showDate: 1, showStartTime: 1, showEndTime: 1 }},   
           {$unwind:{path:"$takenSeats" ,preserveNullAndEmptyArrays:true}},
        {$group:{
             _id: "$_id", 
             showsHall : { $first: '$showsHall' },
             movie : { $first: '$movie' },
             showDate : { $first: '$showDate' },
             showStartTime : { $first: '$showStartTime' },
             showEndTime : { $first: '$showEndTime' },
             takenSeats: {$push : "$takenSeats"} 
              }
        }      
    ])