MongoDB投影到数组中

时间:2016-01-23 12:25:01

标签: mongodb mongodb-query

以下文件包含学生及其家长的dob。

dao.createTodo(x);

在其中一个应用程序用例中,最好以下面的格式接收输出

{ 
    "_id" : ObjectId("56a31573a3b1f89cb895abd3"), 
    "dob" : {
        "isodate" : ISODate("1996-01-21T18:30:00.000+0000")
    }, 
    "parent" : [
        {
            "dob" : {
                "isodate" : ISODate("1956-07-21T18:30:00.000+0000")
            }, 
            "type" : "father"
        }, 
        {
            "dob" : {
                "isodate" : ISODate("1958-11-01T18:30:00.000+0000")
            }, 
            "type" : "mother"
        }
    ]
}

方法是将{ "_id" : ObjectId("56a31573a3b1f89cb895abd3"), "dob" : { "isodate" : ISODate("1996-01-21T18:30:00.000+0000") }, "type" : "student" }, { "_id" : ObjectId("56a31573a3b1f89cb895abd3"), "dob" : { "isodate" : ISODate("1956-07-21T18:30:00.000+0000") }, "type" : "father" }, { "_id" : ObjectId("56a31573a3b1f89cb895abd3"), "dob" : { "isodate" : ISODate("1958-11-01T18:30:00.000+0000") }, "type" : "mother" } 字段转换为数组,然后$project该数组。但是,投影不允许我创建数组。

我相信$unwind及其关联的聚合不能用作我的操作在管道中的同一文档上。

这可能吗? 注意 - 我也可以灵活地更改文档设计。

1 个答案:

答案 0 :(得分:0)

对于Mongo 3.0

这里我添加了一个[null]数组,它允许我使用$ setDiffernce和$ cond的组合在投影中插入数组。这个输出给了带有$parent数组的$ setUnion。

db.p1.aggregate(
{ "$project": {
        "allVal": { 
          '$setUnion': [
            {"$setDifference": [
                { "$map": {
                    "input": [null],
                    "as": "type",
                    "in": { "$cond": [
                        {"$eq": ["$$type", null]},
                        {dob:"$dob", type:{$literal:'student'}},
                        null                        
                    ]}
                }},
                [null] 
            ]}

            , 
            '$parent'
           ]
        }
    }},
    {$unwind : '$allVal'}

)

对于mongo 3.2

感觉天堂,因为我避免了$ setDifference和$ literal hack adjust。

db.p1.aggregate([
{
    $project:{
        parent : 1,
        type: {$literal : 'student'},
        'dob.isodate' : 1
    }
},
{
    $project:{
        allValues: { $setUnion: [ [{dob:"$dob", type:'$type'}], "$parent" ] }
    }
},
{
    $unwind : '$allValues'
}
])

在第一个投影中,我添加了一个名为type

的新字段

在第二个投影中,我正在创建一个包含同一文档的2个不同节点的新数组。

目前此解决方案适用于Mongo 3.2