如何在Node.js中添加和删除嵌套的mongodb集合?

时间:2011-12-20 17:24:58

标签: javascript mongodb node.js

我想在以下mongodb集合中添加和删除“开发人员”。可以有很多项目,每个项目可以有很多用户故事,每个用户故事可以有多个开发人员在上面工作。

问题:

我可以使用哪些mongodb查询将新开发人员添加到“stories”集合中,以及我可以使用哪些mongodb查询从“故事”集合中删除开发人员?

项目的JSON:

{
   "_id": ObjectId("4ef0a2bac8c056bc26000002"),
   "chat": {
     "0": {
       "body": "Test",
       "sender": "brownj2",
       "sent": 1324404459137 
    } 
  },
   "clients": {
     "0": {
       "username": "b" 
    } 
  },
   "owner": "brownj2",
   "stories": {
     "0": {
       "_id": "U89Tq7X8BF2qaBfFzfE99lkb",
       "deadline": "10\/10\/2010",
       "description": "Example user story",
       "developers": {
         /* Developers go here */
       },
       "lane": "2",
       "roi": "0.38",
       "sp": "8",
       "title": "Test #2",
       "type": "story",
       "value": "3" 
    },
     "1": {
       "_id": "EdbzrnoZTh8LTFDNrUSBkVrd",
       "deadline": "10\/10\/2010",
       "description": ".....",
       "developers": {
         /* Developers go here */             
       },
       "lane": "0",
       "roi": "1.00",
       "sp": "4",
       "title": "Test #1",
       "type": "story",
       "value": "4" 
    } 
  },
   "team": {
     "0": {
       "username": "a" 
    } 
  },
   "title": "Example Project" 
}

2 个答案:

答案 0 :(得分:0)

您的设计不一致。你的一些集合是数组,其他是哈希。

我倾向于使用哈希更多,但是我不会对项目使用简单的“数字”索引。例如:

"stories": {
    "0": {
        "_id": "U89Tq7X8BF2qaBfFzfE99lkb",
        "deadline": "10\/10\/2010",
如果它被写为

会更有意义(对我而言)

"stories": {
    "U89Tq7X8BF2qaBfFzfE99lkb": {
        "deadline": "10\/10\/2010",

开发人员也是如此。我想他们有身份证,对吧?所以它应该是

"developers": {
    dev1_id : {username : username1},
    dev2_id : {username : username2}
}

现在,您可以使用简单的set s

来管理这些对象

添加新开发者

db.projects.update({_id: ObjectId("4ef0a2bac8c056bc26000002")},
                   {$set: {"stories.U89Tq7X8BF2qaBfFzfE99lkb.dev3_id" : username3})

拉开发商

db.projects.update({_id: ObjectId("4ef0a2bac8c056bc26000002")},
                   {$unset: {"stories.U89Tq7X8BF2qaBfFzfE99lkb.dev1_id" : 1})

答案 1 :(得分:0)

好的,这是一个解决方法,但似乎工作得很好。我正在服务器上做一些工作,而不是数据库。

  projects.findOne({_id : projectId}, function(err, project)
  {
     for(var i = 0; i < project.stories.length; i++)
     {
       if(project.stories[i]._id == storyId)
       {
         var developers = project.stories[i].developers;
         var size = developers.length;

         var developers[size] = {username : username};

          projects.update( {"stories._id" : storyId},
                    {$set:
                      {
                        "stories.$.developers"  : developers
                      }
                    }, false, true);
       }
     }
  }