updateoneasync query net guide create collection c# mongodb embedding

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; } }

Tutorial del conductor

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