以下文件包含学生及其家长的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
及其关联的聚合不能用作我的操作在管道中的同一文档上。
这可能吗? 注意 - 我也可以灵活地更改文档设计。
答案 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