我有不同类的对象,想将它们存储在MongoDB中的单个集合中。
我正在将asp.net core 2.2与MongoDB.Driver 2.8.0和MongoDB 4.0.5一起使用。 我做了一些尝试。
这个想法:我可以将所有下面的对象存储在一个集合中。目前,我可以保存它们,但无法阅读->获取
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("_Sun00Q")
strName = rst.Fields("PLNames")
strSetName = rst.Fields("SetName")
Set rst2 = dbs.OpenRecordset(strName & "_trackList_RndOrd")
intPLNid = rst2.Fields("PLNid")
intId = rst2.Fields("id")
SQL = "UPDATE " & strSetName & " SET id=" & intId & " WHERE PLNid=" & intPLNid
DoCmd.RunSQL SQL
,但仅在重新运行应用程序之后。在空数据库上,我可以保存对象并检索它们。当我关闭应用程序并且不删除数据库时,在"FormatException: Element '_id' does not match any field or property of class Mongo2.Models.MongoEntity."
我想我缺少一些步骤,或者我的方法无效-在互联网上找不到任何可行的示例。
任何帮助将不胜感激。通过共享指向有效解决方案/示例的链接,或在此处。
型号:
collection.Find(book => true).ToList();
}
数据上下文:
public class MongoEntity
{
}
[BsonIgnoreExtraElements]
public class BookLibrary : MongoEntity
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string BookLibraryId { get; set; }
public List<Book> Library { get; set; }
}
[BsonIgnoreExtraElements]
public class Book : MongoEntity
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string BookId { get; set; }
[BsonElement("Name")]
public string BookName { get; set; }
[BsonElement("Price")]
public decimal Price { get; set; }
[BsonElement("Category")]
public Category Category { get; set; }
[BsonElement("Author")]
public Author Author { get; set; }
[BsonElement("Date")]
public DateTime Added { get; set; }
}
[BsonIgnoreExtraElements]
public class Author : MongoEntity
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string AuthorId { get; set; }
[BsonElement("Author name")]
public string Name { get; set; }
[BsonElement("Author last name")]
public string LastName { get; set; }
}
[BsonIgnoreExtraElements]
public class Category : MongoEntity
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string CategoryId { get; set; }
[BsonElement("Category name")]
public string CategoryName { get; set; }
}
答案 0 :(得分:1)
问题出在Id字段。您已将其自定义,但是MongoDB始终将ID属性存储为_id
到数据库中,并且无法更改。尝试使用BsonElementAttribute更改名称将被忽略。
要解决您的问题,您可以尝试以下操作:
CategoryId
在BsonElement
(以及其他id字段)上添加属性,但是我不确定是否可以使用。CategoryId
更改为Id
(以及其他id字段)答案 1 :(得分:0)
答案非常简单明了,但我却以某种方式错过了。
对象的类型与集合名称没有密切关系,所以我可以使用:
var books = _database.GetCollection<Books>("Books");
var bookLibraries = _database.GetCollection<BookLibrary>("Books");
var authors = _database.GetCollection<Author>("Books");
var categories = _database.GetCollection<Category>("Books");
另一种解决方案是使用BsonDocument类型:
var books = _database.GetCollection<BsonDocument>("Books");
就是这样。