2017-05-08 98 views
0

我想基于数组索引而不是(主键)从一个集合中连接两个数组。MongoDB 3.2:基于数组索引连接两个数组

数据看起来是这样的:

{"_id" : ObjectId("1"), 
    "clicks" : { 
     "cumulative" : { 
      "data" : [ 
       3, 
       7, 
       8 
      ] 
     }, 
     "daily" : { 
      "data" : [ 
       3, 
       4, 
       1 
      ] 
     } 
    }, 
    "websiteId" : "abcdef" 
    "day" : { 
     "isoDate" : [ 
      ISODate("2016-07-07T02:00:00.000+02:00"), 
      ISODate("2016-07-08T02:00:00.000+02:00"), 
      ISODate("2016-07-09T02:00:00.000+02:00") 
      ]} 
    }, 
.... 

我想加盟day.isoDate基于每个数组的索引clicks.cumulative.data。那么该表应该是这样的:

ObjectID Date   Clicks 
    1   2016-07-07 3 
    1   2016-07-08 7 
    1   2016-07-09 8 

我试过到目前为止:

db.collection1.aggregate([ 
    {$unwind: "$day.isoDate"}, 
    {$match: {"websiteId": "abcdef"} 
    } 
    , 
    {$group: {_id: "$day.isoDate.Value"}} 
    ]) 

没有任何人有一个建议?

回答

1

这可以通过告诉mongodb的存储unwinded数组的索引的再一个投影中使用它来实现:

db.test.aggregate([ 
    {"$unwind": { 
     path: "$day.isoDate", 
     includeArrayIndex: "index" 
    }}, 
    {"$project": { 
     "Date" : "$day.isoDate", 
     "Clicks": { 
      "$arrayElemAt" : [ 
       "$clicks.cumulative.data", 
       "$index" 
      ] 
     }} 
    }]) 

这将输出

{ "_id" : ObjectId("5910de2e92842f684b605965"), "Date" : ISODate("2016-07-07T00:00:00Z"), "Clicks" : 3 } 
{ "_id" : ObjectId("5910de2e92842f684b605965"), "Date" : ISODate("2016-07-08T00:00:00Z"), "Clicks" : 7 } 
{ "_id" : ObjectId("5910de2e92842f684b605965"), "Date" : ISODate("2016-07-09T00:00:00Z"), "Clicks" : 8 } 
> 
+0

就像一个魅力!非常感谢你。 –