2011-12-20 72 views
2

我想将“开发人员”添加到以下的mongodb集合中并将其删除。可以有许多项目,每个项目可以有许多用户故事,每个用户故事可以有多个开发人员在其上工作。如何在Node.js中添加和删除嵌套的mongodb集合?

问:

我可以使用哪些MongoDB的查询到新的开发者加入到“故事”集合,我可以用什么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" 
} 

回答

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); 
     } 
    } 
    } 
0

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

我倾向于使用哈希更多,但然后我不使用普通的'数字'索引的项目。例如:

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

会更有意义(我),如果它被写了

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

这同样适用于开发商。我想他们有ID,对吧?所以它应该是

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

现在你可以用简单的管理这些对象点缀set小号

添加新的开发

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

拉开发商

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

由于某种原因,Rockmongo用方括号显示空的散列。在使用大括号启动的JavaScript中。我会修改数据库,并试试这个,谢谢。 – Jack 2011-12-20 18:40:24

+0

这是因为它是用PHP编写的。和PHP不能分辨空数组和空散列(他们是那里相同的东西,AFAIK) – 2011-12-20 18:45:07

+0

我看了一下,并没有改变数据库结构的可能性,因为这意味着改变大量的查询和功能。有没有可行的答案,我的上述问题,而不改变数据库结构? – Jack 2011-12-20 19:04:26