2013-02-18 2 views
1

У меня есть коллекция под названием Org, которая содержит ресурсы (Resources схемы), которая распределяется между командами (Teams схемой)Как упростить сбор mongodb?

{ 
    "_id": ObjectId("511cfbc9d593e5290c000005"), 
    "name": "Some org name", 
    "resources": [ 
     { 
      "_id": ObjectId("511cfbc9d593e5290c000007"), 
      "name": "Printer1", 
      /* mongoose.Schema.Types.Mixed */ 
      "details": { 
       "ip": "192.168.1.99" 
      } 
     }, { 
      "_id": ObjectId("511cfbc9d593e5290c000008") 
      "name": "Fax1", 
      "details": { 
       "number": "XXXXXXXXXXXX" 
      } 
     } 
    ], 
    "teams" : [ 
     { 
      "_id": ObjectId("511cfbc9d593e5290c000012"), 
      "name": "sales", 
      /*"resources": {type: [mongoose.Schema.Types.ObjectId], ref: 'Resources'}*/ 
      "resources": [ObjectId("511cfbc9d593e5290c000007")] 
     }, { 
      "_id": ObjectId("511cfbc9d593e5290c000006"), 
      "name": "developer", 
      "resources": [ObjectId("511cfbc9d593e5290c000007"), ObjectId("511cfbc9d593e5290c000008")] 
     } 
    ]  
} 

Также есть People коллекции, которая является частью команды.

{ 
    "name": "Peter", 
    "designation": "senior s/w engg.", 
    "contact": {} 
    /*"teams": {type: [mongoose.Schema.Types.ObjectId], ref: 'Teams'}*/ 
    "teams": [ObjectId("511cfbc9d593e5290c000006")] 
} 

Теперь я хочу пропустить несколько обновлений, если изменился ресурс или команда, поэтому я не использовал вложенные документы. Я не могу refResources схеме от Teams схеме. В результате, чтобы получить следующий результат, мне нужно пройти очень сложную функцию агрегации.

{ 
    "name": "Peter", 
    "designation": "senior s/w engg.", 
    "contact": {} 
    "teams": [{ 
       "_id": ObjectId("511cfbc9d593e5290c000006"), 
       "name": "developer", 
       "resources": [{ 
        "_id": ObjectId("511cfbc9d593e5290c000007"), 
        "name": "Printer1", 
        "details": { 
         "ip": "192.168.1.99" 
        } 
       }, { 
        "_id": ObjectId("511cfbc9d593e5290c000008") 
        "name": "Fax1", 
        "details": { 
         "number": "XXXXXXXXXXXX" 
        } 
       }]    
    }] 
} 

Может кто-нибудь, пожалуйста, предположите, что если я делаю что-то не так в дизайне db. Есть ли более простой способ?

ответ

3

Теперь я хочу пропустить несколько обновлений, если изменился ресурс или команда, поэтому я не использовал вложенные документы.

Вы найдете это общепринятым компромиссным для рассмотрения в схеме схемы MongoDB. На самом деле это будет сводиться к тому, насколько важно, чтобы вы пропускали несколько обновлений. Часто несколько обновлений не так сложны, как вы думаете, и оказываете правильное решение, особенно когда требуется простота чтения и производительность.

Может кто-нибудь, пожалуйста, подумайте, не делаю ли я что-то не так в дизайне db. Есть ли более простой способ?

Я не думаю, что ваш подход является проблематичным, учитывая ваше намерение избежать нескольких обновлений. Лично в этой ситуации, однако, я бы пошел с подходами вложенных документов и попытался обойти несколько обновлений. Это будет означать гораздо более простой запрос, с лучшей производительностью (что часто имеет тенденцию быть самым важным фактором в разработке приложений).

0

В мангуста, вы можете просто сделать следующее:

People.find({ name: "Peter" }).populate("teams").exec(callback); 

Если это не принести teams.resources заселена (в чем я сомневаюсь, потому что мангуст очень гибок), попробуйте вместо этого:

People.find({ name: "Peter" }) 
    .populate("teams") 
    .populate("teams.resources") 
    .exec(callback); 

Кроме того, не забудьте добавить ref в teams property вашей People схеме.

Смежные вопросы