2015-08-20 2 views
0

У меня есть коллекция, например User, у которой есть список пользователей, и у этого пользователя есть список пользователей. Как иерархия.Обновление во встроенном документе (Вложенная коллекция)

{   
    "_id" : ObjectId("55530326bc687d21783fd1ff"), 
      "Name" : "User 1", 
      "Role" : "Manager", 
     number:NumberLong(0), 
      "1" : 
     [ 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fd"), 
      "Name" : "User 2", 
      "Role" : "Ass Manager", 
     number:NumberLong(0), 
      "1" : 
     [ 
     ....... 
     ] 
     } 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fq"), 
      "Name" : "User 2", 
      "Role" : "Ass Manager", 
    number:NumberLong(1), 
      "1" : 
     [ 
     ......... 
     ] 
     }, 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fg"), 
      "Name" : "User 3", 
      "Role" : "Ass Manager", 
    number:NumberLong(2), 
      "1" : 
     [ 
     ........ 
     ] 
     } 
     ], 
     "2" : 
     [ 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fw"), 
      "Name" : "User 4", 
      "Role" : "Specialist", 
     number:NumberLong(0), 
      "1" : 
     [ 
     ....... 
     ] 
     } 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fe"), 
      "Name" : "User 5", 
      "Role" : "Specialist", 
    number:NumberLong(1), 
      "1" : 
     [ 
     ......... 
     ] 
     }, 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fr"), 
      "Name" : "User 6", 
      "Role" : "Specialist", 
    number:NumberLong(2), 
      "1" : 
     [ 
     ........ 
     ] 
     } 
     ] 
     } 

Выше приведено только одно собрание для образца, например, у меня есть почти 10000 документов. Мне нужно найти коллекцию с номером «0». Даже если какой-либо один встроенный документ имеет «номер» как 0, я хочу этот документ.

Примечание: Я не могу сказать, сколько детей придет для пользователя.

+0

Я думаю, вам нужно немного редактировать. Вам не нужно искать «коллекцию», не так ли? Вам нужно найти документы. Кроме того: вам нужно найти их или обновить их, как предлагает ваш заголовок? –

+0

Прошу прощения, если я знаю запрос на поиск, я могу сам создать запрос на обновление. Поэтому я запрашиваю запрос на поиск. –

+0

Эта схема кажется задуманной :) однако количество элементов в вложенном массиве не будет проблемой, но становится очень сложно, если вы не можете сказать максимальный уровень вложения и ключи, которые у вас есть (" 1 "," 2 "здесь не являются индексами, они являются ключами, а также" Имя "и" Роль "). –

ответ

0

Хорошо, я предполагаю, что каждый из ваших документов пользователя может иметь два массива пользователей-пользователей (а именно «1» и «2») и что у вас максимальный уровень вложенности, скажем 3 (это означает, что вложенный пользователь не может иметь более двух участников). Кстати, the maximum nesting level allowed by mongodb is 100.

Вероятно, это не хочу, чтобы вы хотели: в этом случае у вас есть проблемы с вашим дизайном схемы, потому что

Теперь давайте притворимся, что мои предположения были в порядке для вас. Попробуйте (я звоню свою коллекцию users, так как мы обычно не капитализировать названия коллекции):

db.users.find({$or:["1.number" : 0, "2.number" : 0, "1.1.number":0, "1.2.number":0, ..., "2.2.1.number":0, "2.2.2.number":0]}) 

я пропустил некоторые комбинации, которые нужно добавить. Обратите внимание, что вам не нужно беспокоиться о позиции в массивах, и что только с тремя уровнями вложенности существует довольно много предложений для оператора $or, и это, возможно, убедит вас в том, что лучше следовать связанным лучшим практикам.

ПРИМЕЧАНИЕ для будущих читателей: ОП пояснил в комментарии, что ему действительно не нужен update, но запрос find.

+0

Спасибо за это, я уже поступаю так же, как вы сказали. Есть ли какой-нибудь общий способ найти, иначе я должен изменить свой дизайн схемы. –

+0

Ответ: нет, вы не можете найти, когда не знаете имена ключей и уровень вложенности. Я действительно предлагаю изменить дизайн scema –

+0

Спасибо за вашу помощь. Теперь я работаю над этим. :-( –

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