MongoDb and C# Driver (Непонятка)

81 views
Skip to first unread message

Максим Белов

unread,
Mar 2, 2014, 1:08:08 PM3/2/14
to mongodb-us...@googlegroups.com
Приветствую участников группы.

Только начинаю использовать MongoDb, поэтому не судите строго.

Ситуация такова, создаю документ с вложенной коллекцией документов и при этом хочу видеть идентификатор типа ObjectId у документов вложенной коллекции, 
но получается как-то странно.

Классы.
 public class Employee : EntityBase
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<Depatments> Depatments { get; set; }
    }

    public class Depatments : EntityBase
    {
        public string Name { get; set; }
    }

    public class EntityBase
    {
        [BsonId]
        public virtual ObjectId Id { get; set; }
    }

Результат.

/* 0 */
{
  "_id" : ObjectId("5313718c6a2f4f164ca04230"),
  "FirstName" : "Sam",
  "LastName" : "Smit",
  "Depatments" : [{
      "_id" : ObjectId("000000000000000000000000"),
      "Name" : "Develop"
    }]
}

Может я что-то упустил?
Подскажите пожалуйста, как с этим бороться?

Serge Matveenko

unread,
Mar 3, 2014, 3:45:40 AM3/3/14
to mongodb-us...@googlegroups.com
2014-03-02 22:08 GMT+04:00 Максим Белов <maxraim...@gmail.com>:
> Ситуация такова, создаю документ с вложенной коллекцией документов и при
> этом хочу видеть идентификатор типа ObjectId у документов вложенной
> коллекции,

Первый вопрос: зачем нужен такой идентификатор внутри документа?



--
Serge Matveenko
mailto: se...@matveenko.ru
github: http://lnkfy.com/1
linkedin: http://lnkfy.com/S

Пародуй.рф -- http://www.parodui.ru/
Специализированный магазин электронных сигарет
СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24

Serge Matveenko

unread,
Mar 3, 2014, 3:48:26 AM3/3/14
to mongodb-us...@googlegroups.com
2014-03-02 22:08 GMT+04:00 Максим Белов <maxraim...@gmail.com>:
> Может я что-то упустил?
> Подскажите пожалуйста, как с этим бороться?

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

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

Вся осталяная логика целиком и полностью зависит от вас.

Максим Белов

unread,
Mar 3, 2014, 7:36:55 AM3/3/14
to mongodb-us...@googlegroups.com, s...@matveenko.ru
Приветствую Сергей.

Вложенных документов может быть очень много. Id собирался использовать для реализации CRUD этих документов, 
но предполагаю что необходимо будет реализовать id-генератор для них.
Или есть более красивый путь решения этой проблемы?

P.S. Только недавно начал использовать NoSQL СУБД, а привычки с SQL еще живы :-).

понедельник, 3 марта 2014 г., 12:48:26 UTC+4 пользователь lig написал:

Serge Matveenko

unread,
Mar 3, 2014, 7:43:01 AM3/3/14
to mongodb-us...@googlegroups.com
Для чего вам таки id? Выбираете вы все равно весь документ со всеми
вложеными (можно лимитировать поля, но это все равно будет тот же
документ, просто не полный).

Т.е. запросы из CRUD вы должны делать к основному документу.

Может начнем с вашей задачи? Хотя бы с примерного ее описания.
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to mongodb-user-rus...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.

Максим Белов

unread,
Mar 3, 2014, 8:36:02 AM3/3/14
to mongodb-us...@googlegroups.com, s...@matveenko.ru
Задача проста и стара, как мир в котором мы живем :-).
Это простая база контрагентов.
Есть лицо(Юридическое, Физическое) и у него куча атрибутов (реквизиты, адрес, вид деятельности и т.д.).
Периодически необходимо будет менять, как сам документ так и его атрибуты.

Возможно, я не совсем понял методику работы с вложенными документами.

Как мне в таком случае отредактировать один из адресов контрагента?

Как мне тогда производить и сортировать выборки в клиенте?

Рефлекс с SQL СУБД подсказывает, что нужен какой-то идентификатор.

понедельник, 3 марта 2014 г., 16:43:01 UTC+4 пользователь lig написал:

Serge Matveenko

unread,
Mar 3, 2014, 8:48:07 AM3/3/14
to mongodb-us...@googlegroups.com
Идентификатор уже есть у документа. Все остальное -- его поля.
Некоторые из этих полей имеют сложную структуру, пожтому вы делаете
для этой структуры представление в виде вложенного документа.

Таким образом, изменение любого поля вложенного документа -- это
изменение поля основного документа. Т.е. созранять вы должны его.
После того как вы выбрали основной документ из базы, вы работаете уже
со структурой вашего ЯП, изменяете поля, а потом сохраняете структуру,
т.е. изменяете целиком весь документ, вместе с вложенными.

Попробуйте произвести нужные вам, вызывающие вопросы, операции в
консоли MongoDB, тогда станет понятнее как объяснить драйверу, что вы
хотите сделать.
>> > email to mongodb-user-rus...@googlegroups.com.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>> --
>> Serge Matveenko
>> mailto: se...@matveenko.ru
>> github: http://lnkfy.com/1
>> linkedin: http://lnkfy.com/S
>>
>> Пародуй.рф -- http://www.parodui.ru/
>> Специализированный магазин электронных сигарет
>> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to mongodb-user-rus...@googlegroups.com.

Максим Белов

unread,
Mar 3, 2014, 9:54:57 AM3/3/14
to mongodb-us...@googlegroups.com, s...@matveenko.ru
На сколько я понял, Update в MongoDB всего документа, т. е. не имеет значения сколько я изменю вложенных документов, 
перезапишется весь документ в целом?

понедельник, 3 марта 2014 г., 17:48:07 UTC+4 пользователь lig написал:
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>> --
>> Serge Matveenko
>> mailto: se...@matveenko.ru
>> github: http://lnkfy.com/1
>> linkedin: http://lnkfy.com/S
>>
>> Пародуй.рф -- http://www.parodui.ru/
>> Специализированный магазин электронных сигарет
>> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an

Serge Matveenko

unread,
Mar 3, 2014, 4:25:26 PM3/3/14
to mongodb-us...@googlegroups.com
В общем да. Можно перезаписывать конкретные поля и вложенные в списки
структуры, как нумерованные элементы списков. Но обращение к этим
данным и их поиск (исключая индекс) все равно будет происходить по _id
основного документа.

Если проводить аналогии с SQL, документ MongoDB -- это одна запись в
БД. Поля могут содержать сложные структуры данных, но смысл от этого
не меняется.
>> >> > email to mongodb-user-rus...@googlegroups.com.
>> >> > For more options, visit https://groups.google.com/groups/opt_out.
>> >>
>> >>
>> >>
>> >> --
>> >> Serge Matveenko
>> >> mailto: se...@matveenko.ru
>> >> github: http://lnkfy.com/1
>> >> linkedin: http://lnkfy.com/S
>> >>
>> >> Пародуй.рф -- http://www.parodui.ru/
>> >> Специализированный магазин электронных сигарет
>> >> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "MongoDB по-русски" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to mongodb-user-rus...@googlegroups.com.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>> --
>> Serge Matveenko
>> mailto: se...@matveenko.ru
>> github: http://lnkfy.com/1
>> linkedin: http://lnkfy.com/S
>>
>> Пародуй.рф -- http://www.parodui.ru/
>> Специализированный магазин электронных сигарет
>> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to mongodb-user-rus...@googlegroups.com.

Максим Белов

unread,
Mar 3, 2014, 11:22:10 PM3/3/14
to mongodb-us...@googlegroups.com, s...@matveenko.ru
Спасибо за разъяснение.

вторник, 4 марта 2014 г., 1:25:26 UTC+4 пользователь lig написал:
>> >> > For more options, visit https://groups.google.com/groups/opt_out.
>> >>
>> >>
>> >>
>> >> --
>> >> Serge Matveenko
>> >> mailto: se...@matveenko.ru
>> >> github: http://lnkfy.com/1
>> >> linkedin: http://lnkfy.com/S
>> >>
>> >> Пародуй.рф -- http://www.parodui.ru/
>> >> Специализированный магазин электронных сигарет
>> >> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "MongoDB по-русски" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>> --
>> Serge Matveenko
>> mailto: se...@matveenko.ru
>> github: http://lnkfy.com/1
>> linkedin: http://lnkfy.com/S
>>
>> Пародуй.рф -- http://www.parodui.ru/
>> Специализированный магазин электронных сигарет
>> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an

Asya Kamsky

unread,
Mar 5, 2014, 5:03:36 AM3/5/14
to mongodb-us...@googlegroups.com, s...@matveenko.ru

Это не совсем точно. 

При поиске по индексированных поля, индекс укажет где документ, так что если индекс  (кроме _id) то это поле, по которому вы найдете этот документ. 

Это полезно иметь идентифицирующую поле на вложенных документoв, так что вы можете искать и изменить только его атрибуты. Это не должны быть "_id". 

Например: 

db.collection.update ({"Department.Name": "Develop"}, {"$set": {"Department.$.Number" : 5}}, {multi: true }); 

Это изменит только внутренние вложенные документы, которые имеют Name "develop", чтобы добавить "Number" 5. Обратите внимание, что верхний ID никогда не использовался. Если есть индекс на Department.Name ", то он будет использоваться, и это будет указывать где документ. 

Ася
>> >> > For more options, visit https://groups.google.com/groups/opt_out.
>> >>
>> >>
>> >>
>> >> --
>> >> Serge Matveenko
>> >> mailto: se...@matveenko.ru
>> >> github: http://lnkfy.com/1
>> >> linkedin: http://lnkfy.com/S
>> >>
>> >> Пародуй.рф -- http://www.parodui.ru/
>> >> Специализированный магазин электронных сигарет
>> >> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "MongoDB по-русски" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>> --
>> Serge Matveenko
>> mailto: se...@matveenko.ru
>> github: http://lnkfy.com/1
>> linkedin: http://lnkfy.com/S
>>
>> Пародуй.рф -- http://www.parodui.ru/
>> Специализированный магазин электронных сигарет
>> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an

Serge Matveenko

unread,
Mar 5, 2014, 5:28:30 AM3/5/14
to Asya Kamsky, mongodb-us...@googlegroups.com
Ровно это я имел в виду, когда писал "исключая индекс". Естественно
все равно какой индекс использовать по "_id" или по любому другому
полю.

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

Однако, в результате все равно будет найден основной документ и именно
его BSON объект будет модифицирован. А, насколько мне известно, это
означает, что он будет прочитан целиком и собран заново так, чтобы
удоволетворять запросу.

Т.е. по факту перезапишется весь документ. При этом, если его новый
размер превысит отведенное место, то он будет физически перемещен в
конец коллекции. Стоит учесть, что здесь есть и положительные стороны.
Операция записи будет одна на весь основной документ. Т.е. если вы
измените 5 документов, которые будут вложены в один общий, то обновите
вы только один базовый документ.
>> >> >> > email to mongodb-user-rus...@googlegroups.com.
>> >> >> > For more options, visit https://groups.google.com/groups/opt_out.
>> >> >>
>> >> >>
>> >> >>
>> >> >> --
>> >> >> Serge Matveenko
>> >> >> mailto: se...@matveenko.ru
>> >> >> github: http://lnkfy.com/1
>> >> >> linkedin: http://lnkfy.com/S
>> >> >>
>> >> >> Пародуй.рф -- http://www.parodui.ru/
>> >> >> Специализированный магазин электронных сигарет
>> >> >> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>> >> >
>> >> > --
>> >> > You received this message because you are subscribed to the Google
>> >> > Groups
>> >> > "MongoDB по-русски" group.
>> >> > To unsubscribe from this group and stop receiving emails from it,
>> >> > send
>> >> > an
>> >> > email to mongodb-user-rus...@googlegroups.com.
>> >> > For more options, visit https://groups.google.com/groups/opt_out.
>> >>
>> >>
>> >>
>> >> --
>> >> Serge Matveenko
>> >> mailto: se...@matveenko.ru
>> >> github: http://lnkfy.com/1
>> >> linkedin: http://lnkfy.com/S
>> >>
>> >> Пародуй.рф -- http://www.parodui.ru/
>> >> Специализированный магазин электронных сигарет
>> >> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "MongoDB по-русски" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to mongodb-user-rus...@googlegroups.com.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>> --
>> Serge Matveenko
>> mailto: se...@matveenko.ru
>> github: http://lnkfy.com/1
>> linkedin: http://lnkfy.com/S
>>
>> Пародуй.рф -- http://www.parodui.ru/
>> Специализированный магазин электронных сигарет
>> СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24



--
Reply all
Reply to author
Forward
0 new messages