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 будет создано автоматически.
В этой ссылке вы найдете альтернативные способы настроить автоматически генерируемые идентификаторы.