net from create collection c# asp.net-mvc mongodb mongodb-.net-driver

c# - from - Buenas prácticas de MongoDB para hacer referencia



mongodb insert c# (2)

Me pregunto cuál sería la situación en la mejor práctica para el modelado mediante el uso de referencias. Estoy usando la biblioteca de MongoRepository .

public class User : Entity { publis string Id { get; set; } public string Email { get; set; } public string Password { get; set; } } public class Post : Entity { public string Id { get; set; } public string Title { get; set; } public string Summary { get; set; } public DateTime Added { get; set; } public User Owner { get; set; } }

Al almacenar el Post, solo deseo referencia al objeto Owner (Usuario) en lugar de a todo el objeto subyacente.

Actualmente lo estoy haciendo así, sin saber de una mejor manera ...

var post = new Post { Title = "Example title", Summary = "asd asd", Added = DateTime.Now, Owner = new User { Id = "someExistingUserId" } }; postRepository.Update(post); //Save

..

//Then to get the post var post = postRepository.GetById("previouslySavedPostId"); post.Owner = userRepository.GetById(post.Owner.Id); return post;

userRepository y postRepository son del tipo MongoRepository.

¿Es este el enfoque correcto para resolver mi problema usando MongoDB con C # / MVC (4)?


Mongo es una base de datos de documentos y si está acostumbrado a usar el servidor sql, requiere una forma de pensar ligeramente diferente.

Como no desea los detalles de la contraseña del usuario en cada publicación, la forma en que probablemente lo haría es crear una nueva clase para contener cualquier información de usuario que pueda ser necesaria para mostrar una publicación.

public class PostOwnerInfo { public string UserId { get; set; } public string Name { get; set; } }

Actualice su entidad de publicación, reemplazando la propiedad Owner con una propiedad OwnerInfo, de tipo PostOwnerInfo.

Luego, cuando crees una nueva publicación, haz lo siguiente.

var user = userRepository.GetById(someExistingUserId); var post = new Post { Title = "Example title", Summary = "Example summary", Added = DateTime.Now, OwnerInfo = new PostOwnerInfo { UserId = user.Id, Name = user.Name } }; postRepository.Update(post);

De esta forma, cuando solicite una publicación, tendrá toda la información de usuario que necesite para mostrar la publicación en su propiedad OwnerInfo sin necesidad de más consultas.

var post = postRepository.GetById(previouslySavedPostId); // post.OwnerInfo will contain user info

Existe una cierta cantidad de redundancia de datos, pero en una base de datos de documentos así es como lo haría.

Si necesita la información completa del usuario por cualquier motivo, haga una consulta por separado como lo hacía antes.

La idea es que almacene toda la información de usuario que necesita para una publicación en un documento secundario de la publicación, por lo que no debería necesitar hacer una consulta separada para el usuario.

Si los datos de usuario cambian, simplemente actualice el campo UserInfo en todas las publicaciones hechas por su usuario.

Sus datos de usuario rara vez cambiarán, pero consultará las publicaciones con mucha frecuencia.


Puede usar el objeto DBRef en lugar del objeto User.

public class Post : Entity { public string Id { get; set; } public string Title { get; set; } public string Summary { get; set; } public DateTime Added { get; set; } public DBRef Owner { get; set; } }

Entonces tú puedes:

var mongo = new Mongo(config.BuildConfiguration()); mongo.Connect(); var DB = mongo.GetDatabase(_dataBaseName) var post = new Post(); post.Owner = new DBRef("User", userId); //First parameter is a mongoDB collection name and second is object id //To fetch object referenced by DBRef you should do following var owner = DB.FollowReference<User>(post.Owner);