query - updateoneasync mongodb c#
MongoDB: los ID generados automáticamente son ceros (3)
No es tanto un error como un caso de expectativas no cumplidas. Sólo el _id de nivel superior se asigna automáticamente un valor. El código del cliente debe asignar valores a cualquier _ids incrustado (use ObjectId.GenerateNewId). También es posible que ni siquiera necesite un ObjectId en la clase de Dirección (¿cuál es el propósito de esto?).
Estoy usando MongoDB y el controlador oficial C # 0.9
Sólo estoy comprobando cómo funciona la incrustación de documentos simples.
Hay 2 clases fáciles:
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; }
}
Creo un nuevo usuario:
var user = new User
{
Name = "Sam",
Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } })
};
collection.Insert(user.ToBsonDocument());
El usuario se guarda con éxito, así es su dirección.
Después de escribir
db.users.find()
En el shell de MongoDB, obtuve el siguiente resultado:
{ "_id" : ObjectId("4e572f2a3a6c471d3868b81d"), "Name" : "Sam", "Addresses" : [
{
"_id" : ObjectId("000000000000000000000000"),
"Street" : "BIGSTREET",
"House" : "BIGHOUSE"
}
] }
¿Por qué es la dirección ''objeto id 0?
Hacer consultas con la dirección funciona sin embargo:
collection.FindOne(Query.EQ("Addresses.Street", streetName));
Devuelve el usuario "Sam".
Obtener la colección como tipo de usuario:
var collection = db.GetCollection<User>("users");
Inicialice el campo _id de la siguiente manera:
var user = new User
{
_id = ObjectId.Empty,
Name = "Sam",
Addresses = (new Address[] { new Address { House = "BIGHOUSE", Street = "BIGSTREET" } })
};
Luego inserta el objeto:
collection.InsertOne(user);
El campo _id se generará automáticamente.
En este link , encontrará formas alternativas de personalizar las ID generadas automáticamente.
Utilice el atributo BsonId:
public class Address
{
[BsonId]
public string _id { get; set; }
public string Street { get; set; }
public string House { get; set; }
}
Identificando el campo de identificación o propiedad
Para identificar qué campo o propiedad de una clase es el Id, puede escribir:
public class MyClass { [BsonId] public string SomeProperty { get; set; } }
Editar
En realidad no está funcionando. Voy a comprobar más tarde por qué. Si necesita que funcione, siga estos pasos:
[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());
}