2011-01-04 16 views
18

que estoy usando MongoDB y piloto oficial de C# 0.9MongoDB: IDs generados automáticamente son ceros

Sólo estoy comprobando cómo la incorporación de documentos simples obras.

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 correctamente, por lo que es su discurso.

Después de escribir

db.users.find() 

en consola MongoDB, me dieron el siguiente resultado:

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

¿Por qué dirección de objeto id 0?

Hacer consultas con la dirección de obras sin embargo:

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

Se devuelve al usuario "Sam".

+0

hago una suposición: si inserta otra fila, y recupera la nueva fila, la identificación sigue siendo 000000000000 – cristian

+0

@ Octopus-Paul, sí, eso es correcto. – Alex

Respuesta

8

Uso BsonId atributo:

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

Identificar el campo Id o propiedad

Para identificar qué campo o propiedad de una clase es el ID que se puede escribir:

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

Driver Tutorial

Editar

De hecho, es no trabajar. Voy a verificar más tarde por qué. Si necesita conseguir que funcione el uso siguiente:

[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()); 
    } 
+0

Gracias por la respuesta, pero todavía tengo ceros ... – Alex

+1

bien, déjame ver. –

+0

Parece un error del controlador. –

24

No es tanto un error como un caso de expectativas no satisfechas. Solo al _id de nivel superior se le asigna automáticamente un valor. El código del cliente debe asignar valores a los _ids incorporados (use ObjectId.GenerateNewId). También es posible que ni siquiera necesite un ObjectId en la clase Address (¿para qué sirve?).

+0

Oh, siempre he pensado que ObjectID son obligatorios para todos los documentos. Si está bien no tener ID todo, entonces es genial. No lo llamaría expectativas no satisfechas, porque, por ejemplo, el controlador de Ruby crea identificadores para documentos incrustados. – Alex

+1

¿Está esto documentado en alguna parte? No he visto ninguna mención de eso. ¿Cuál es la razón detrás de la autoasignación de la raíz, pero no de los documentos emdeded (pensé que eran todos 'documentos')? – UpTheCreek

+0

Además, ¿alguna forma de usar el generador GUID de Peine de esta manera? – UpTheCreek

2

Obtener la colección como Tipo de usuario:

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

Inicializar _ID campo de la siguiente manera:

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

A continuación, insertar el objeto:

collection.InsertOne(user); 

El campo _id automáticamente ser generado.

En este link encontrará formas alternativas de haber personalizado ID (s) auto-generado.

Cuestiones relacionadas