Как я могу добавить и удалить вложенную коллекцию mongodb в Node.js? - PullRequest
2 голосов
/ 20 декабря 2011

Я хотел бы добавить и удалить «разработчиков» в следующую коллекцию mongodb. Проектов может быть много, в каждом проекте может быть много пользовательских историй, и в каждой пользовательской истории могут работать несколько разработчиков.

Вопрос:

Какой запрос mongodb я могу использовать для добавления новых разработчиков в коллекцию "Stories", и какой запрос mongodb я могу использовать для удаления разработчиков из коллекции "Stories"?

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 голосов
/ 21 декабря 2011

Хорошо, это обходной путь, но, похоже, он работает довольно хорошо.Я делаю часть работы на сервере, а не на базе данных.

  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 голосов
/ 20 декабря 2011

У вас противоречивый дизайн. Некоторые из ваших коллекций - это массивы, другие - хэши.

Я склонен чаще использовать хэши, но тогда я не использую простые «числовые» индексы для элементов. Например:

"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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...