MongoDB: автоматически генерируемые идентификаторы являются нулями

я использую 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"
        }
] }

почему адрес ' ID объекта 0?

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

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

он возвращает пользователя "Sam".

3 ответов


использовать атрибут BsonId:

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

идентификация поля 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());
    }

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


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

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 будет создано автоматически.

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