2

有聚合管道:

db.getCollection('yourCollection').aggregate(
    { 
     $unwind: { 
      path: "$dates", 
      includeArrayIndex: "idx" 
     } 
    }, 
    { 
     $project: { 
      _id: 0, 
      dates: 1, 
      numbers: { $arrayElemAt: ["$numbers", "$idx"] }, 
      goals: { $arrayElemAt: ["$goals", "$idx"] }, 
      durations: { $arrayElemAt: ["$durations", "$idx"] } 
     } 
    } 
) 

其以下数据进行(样本文档):

{ 
    "_id" : ObjectId("52d017d4b60fb046cdaf4851"), 
    "dates" : [ 
     1399518702000, 
     1399126333000, 
     1399209192000, 
     1399027545000 
    ], 
    "dress_number" : "4", 
    "name" : "J. Evans", 
    "numbers" : [ 
     "5982", 
     "5983", 
     "5984", 
     "5985" 
    ], 
    "goals": [ 
     "1", 
     "0", 
     "4", 
     "2" 
    ], 
    "durations": [ 
     "78", 
     "45", 
     "90", 
     "90" 
    ] 
} 

{ 
    "_id" : ObjectId("57e250c1b60fb0213d06737c"), 
    "dates" : [ 
     "1399027545000", 
     "1399101432000", 
     "1399026850000", 
     "1399904504000" 
    ], 
    "dress_number" : "6", 
    "name" : K. Mitnick, 
    "numbers" : [ 
     "0982", 
     "0981", 
     "0958", 
     "0982" 
    ], 
    "durations" : [ 
     98, 
     110, 
     66, 
     92 
    ], 
    "goals" : [ 
     "2", 
     "3", 
     "0", 
     "1" 
    ] 
} 

的查询工作良好,但也有重复记录,所以我试图使用$addToSet运营商以避免重复:

db.getCollection('yourCollection').aggregate(
     { 
      $match: { 
       "number": number 
      } 
     }, 
     { 
      $unwind: { 
       path: "$dates", 
       includeArrayIndex: "idx" 
      } 
     }, 
     $group: { 
        _id: '$_id', 
        dates: { $addToSet: '$dates' } 
     }, 
     { 
      $project: { 
       _id: 0, 
       dates: 1, 
       numbers: { $arrayElemAt: ["$numbers", "$idx"] }, 
       goals: { $arrayElemAt: ["$goals", "$idx"] }, 
       durations: { $arrayElemAt: ["$durations", "$idx"] } 
      } 
     } 
    ) 

但我只拿到日期(其它场均null

{ dates: 
    [ '1399026850000', 
     '1399101432000', 
     '1399027545000', 
     '1399904504000', 
     '1399024474000', 
     '1399126333000' ], 
    numbers: null, 
    goals: null, 
    durations: null }, 
    { dates: 
    [ '1399027545000', 
     '1399024474000', 
     '1399518702000', 
     '1399126333000', 
     '1399209192000', 
     '1399356651000' ], 
    numbers: null, 
    goals: null, 
    conversation_durations: null }, 
    { dates: 
    [ '1399026850000', 
     '1399101432000', 
     '1399027545000', 
     '1399904504000', 
     '1399024474000' ], 
    numbers: null, 
    goals: null, 
    durations: null } 

有谁知道问题出在哪里?

+1

,你基本上排除了所有其他变量。在那之后你不能重新投射它们。 如果你所要做的只是从你的数组中删除重复项,最好的办法是在你的javascript /客户端代码中执行此操作,或者使用map-reduce。看到这里:http://stackoverflow.com/questions/9862255/how-to-remove-duplicate-entries-from-an-array 你也可以修改你的$组管道阶段添加在那里的其他领域(见chridam的回答)。 – dyouberg

回答

5

您需要使用$first操作如下以包括$group管道内的字段:

db.getCollection('yourCollection').aggregate([ 
    { "$unwind": "$dates" }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "dates": { "$addToSet": "$dates" }, 
      "numbers": { "$first": "$numbers" }, 
      "goals": { "$first": "$goals" }, 
      "durations": { "$first": "$durations" } 
     } 
    }, 
    { "$unwind": { 
      "path": "$dates", 
      "includeArrayIndex": "idx" 
    } }, 
    { 
     "$project": { 
      "_id": 0, 
      "dates": 1, 
      "numbers": { "$arrayElemAt": ["$numbers", "$idx"] }, 
      "goals": { "$arrayElemAt": ["$goals", "$idx"] }, 
      "durations": { "$arrayElemAt": ["$durations", "$idx"] } 
     } 
    } 
]) 

或使用$setUnion消除重复的:当你做的$组

db.getCollection('yourCollection').aggregate([ 
    { 
     "$project": { 
      "_id": 0, 
      "dates": { "$setUnion": ["$dates", "$dates"] }, 
      "numbers": 1, 
      "goals": 1, 
      "durations": 1 
     } 
    } 
    { "$unwind": { 
      "path": "$dates", 
      "includeArrayIndex": "idx" 
    } }, 
    { 
     "$project": { 
      "_id": 0, 
      "dates": 1, 
      "dateIndex": "$idx", 
      "numbers": { "$arrayElemAt": ["$numbers", "$idx"] }, 
      "goals": { "$arrayElemAt": ["$goals", "$idx"] }, 
      "durations": { "$arrayElemAt": ["$durations", "$idx"] } 
     } 
    } 
]) 
+0

谢谢,我已经尝试过这两种解决方案,但仍有重复:/ – corry

+0

您是否可以使用生成重复项目的示例文档更新您的问题,以及如何使用这些文档显示预期输出? – chridam

+0

请看看这个问题http://stackoverflow.com/questions/39426022/mongodb-show-children-items-in-one-to-many-relationship/39426859#39426859 – corry