MongoDB: автоматически сгенерированные идентификаторы равны нулю - PullRequest
18 голосов
/ 04 января 2011

Я использую MongoDB и официальный драйвер C # 0,9

Я просто проверяю, как работает встраивание простых документов.

Есть 2 легких класса:

public class User
{
    public ObjectId _id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Address> Addresses { get;set; }
}

public class Address
{
    public ObjectId _id { get; set; }
    public string Street { get; set; }
    public string House { get; set; }
}

Я создаю нового пользователя:

var user = new User
{
    Name = "Sam",
    Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } })
};

collection.Insert(user.ToBsonDocument());

Пользователь успешно сохранен, как и его адрес.

После ввода

db.users.find()

в оболочке MongoDB я получил следующий результат:

{ "_id" : ObjectId("4e572f2a3a6c471d3868b81d"), "Name" : "Sam",  "Addresses" : [
        {
                "_id" : ObjectId("000000000000000000000000"),
                "Street" : "BIGSTREET",
                "House" : "BIGHOUSE"
        }
] }

Почему адрес 'объекта с идентификатором 0?

Выполнение запросов с адресом работает, хотя:

collection.FindOne(Query.EQ("Addresses.Street", streetName));

Возвращает пользователя «Сэм».

Ответы [ 3 ]

24 голосов
/ 04 января 2011

Это не столько ошибка, сколько случай неудовлетворенных ожиданий.Только верхнему уровню _id автоматически присваивается значение.Любому встроенному _id должно быть присвоено значение клиентским кодом (используйте ObjectId.GenerateNewId).Также возможно, что вам даже не нужен ObjectId в классе Address (для чего он нужен?).

12 голосов
/ 04 января 2011

Используйте атрибут BsonId:

public class Address
{
    [BsonId]
    public string _id { get; set; }
    public string Street { get; set; }
    public string House { get; set; }
}

Определение поля или свойства Id

Чтобы определить, какое поле или свойство класса является идентификатором Idможно написать:

public class MyClass {
    [BsonId]
    public string SomeProperty { get; set; }
}

Учебник для водителя

Редактировать

На самом деле это не работаетЯ проверю позже, почему.Если вам нужно заставить его работать, используйте следующее:

    [Test]
   public void Test()
    {
        var collection = Read.Database.GetCollection("test");

        var user = new User
        {
            Name = "Sam",
            Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET", _id = ObjectId.GenerateNewId().ToString() } })
        };

        collection.Insert(user.ToBsonDocument());
    }
2 голосов
/ 25 марта 2017

Получить коллекцию как Тип пользователя:

var collection = db.GetCollection<User>("users");

Инициализировать поле _id следующим образом:

var user = new User
{
   _id = ObjectId.Empty,
   Name = "Sam",
   Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } })
};

Затем вы вставляете объект:

collection.InsertOne(user);

Поле _id будет сгенерировано автоматически.

В этой ссылке вы найдете альтернативные способы настройки автоматически сгенерированных идентификаторов.

...