在Aggregate中生成ObjectID

时间:2017-05-22 09:14:30

标签: mongodb mongodb-query aggregation-framework objectid

我有一个名为的集合(见下文),其中包含他们的个人详细信息和技能。从该集合中,我想创建一个新的集合(定期更新),其中包含填充ObjectID的特定技能的总发生次数。应使用正确的对象ID更新集合中的技能。

现在我有以下查询:

db.people.aggregate([ 
    { $unwind: "$expertise" },
    { $group : { 
        _id: "$expertise.item",
        count: { $sum: 1 },
        people: { $push: "$_id" } 
        } 
    }
])

这给了我新的集合,但不幸的是我无法在该查询中生成唯一的objectID。它一直告诉我预期会有一个累加器对象。

如何生成技能数据库,每个技能具有唯一的ObjectID,更新 集合,并具有正确的技能ObjectID& #39;?的

与人,他们的个人详细信息和特定技能组合的集合。我删除了此示例的大部分数据。

{
"_id" : ObjectId("591c5d9be75d8a0d34f61786"),
"id" : 1,
"username" : "user@name.com",
"expertise" : [ 
    {
        "niveau" : 5,
        "item" : "High Availability Systems"
    }, 
    {
        "niveau" : 8,
        "item" : "Object Oriented Design"
    }
],
"function" : "functionname"
},
{
"_id" : ObjectId("591c5d9be75d8a0d34f61787"),
"id" : 2,
"username" : "user@name.com",
"expertise" : [ 
    {
        "niveau" : 9,
        "item" : "High Availability Systems"
    }, 
    {
        "niveau" : 4,
        "item" : "Java"
    }
],
"function" : "functionname"
}

新收藏:技能

从这个系列中我想创建一个新的集合,其中objectID的人在一个数组中被重用。它应该导致这样的事情:

{
    "_id" : ObjectId("591c5d9be75d8a0d456324"),
    "item" : "High Availability Systems",
    "people" : [ 
        "591c5d9be75d8a0d34f61786",
        "591c5d9be75d8a0d34f61787"
    ],
    "count" : 2
},
{
    "_id" : ObjectId("591c5d9be75d8a0d451234"),
    "item" : "Java",
    "people" : [ 
        "591c5d9be75d8a0d34f61786"
    ],
    "count" : 1
}

1 个答案:

答案 0 :(得分:1)

直接从评论中复制,以便其作为答案可见

将 0 分配给 _id 字段会导致 mongodb 生成一个 ObjectId。

db.people.aggregate([
   {
      "$unwind":"$expertise"
   },
   {
      "$group":{
         "_id":"$expertise.item",
         "count":{
            "$sum":1
         },
         "people":{
            "$push":"$_id"
         }
      }
   },
   {
      "$project":{
         "_id":0,
         "item":"$_id",
         "count":1,
         "people":1
      }
   },
   {
      "$out":"newskills"
   }
])