在聚合中生成ObjectID

5

我有一个叫做people(如下所示)的集合,包含他们的个人信息和技能。我想从那个集合中创建一个新的集合(定期更新),其中包含填充有ObjectID的某种技能的总次数。在people集合中的技能应该用正确的Object ID进行更新。

现在我有以下查询:

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

这让我得到了新的集合,但不幸的是我无法在查询中生成唯一的objectID,它一直告诉我需要累加器对象。
如何使用每个技能的唯一ObjectID生成技能数据库,并使用正确的技能ObjectID更新People集合?
People 一个包含人员、个人详细信息和特定技能集的集合。为了本示例,我已经删除了大部分数据。
{
"_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
}

请参阅文档中的$out - Neil Lunn
1
谢谢。我现在已经解决了那个部分。我的查询现在是: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" } ]) - Matthijs Mali
嗯,不完全是这样。我仍然需要更新people集合,以便在skills集合中引用正确的objectID。 - Matthijs Mali
我不打算外包。只是想在正确的方向上得到一些推动。你问我问题是否解决。嗯,还没有完全解决。MongoDB文档非常详尽和庞大。对于来自非数据库背景的人来说,找到正确的入口点可能会很困难。感谢您为我提供了一些基础知识和方向指引! - Matthijs Mali
好的。方向。循环集合。 - Neil Lunn
显示剩余3条评论
1个回答

4
将 _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"
   }
])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接