mongodb 项目'Id'不符合类别的任何字段或属性

neekobn8  于 2022-11-22  发布在  Go
关注(0)|答案(9)|浏览(119)

我从MongoDB中的集合得到了结果,结构如下所示

[DataContract]
public class Father
{
    [BsonId]
    [DataMember]
    public MongoDB.Bson.ObjectId _id { get; set; }

    [DataMember]
    public string Id { get; set; }

    [DataMember]
    public List<Child> childs { get; set; }
}

[DataContract]
public class Child
{
    [DataMember]
    public string Id { get; set; }

    [DataMember]
    public int Name { get; set; }
}

当我尝试这个:

List<Father> f = result.ToList();

它调用Element 'Id' does not match any field or property of the class Model.Child
我认为它只是把“身份”当作了别的东西。
我该怎么处理呢?谢谢

6mzjoqzu

6mzjoqzu1#

你可以通过在类声明的顶部添加[BsonIgnoreExtraElements]来解决这个问题。ObjectId由MongoDB内部维护,除非你想从对象中获得额外的信息,比如时间戳,否则可能不需要它。希望这能有所帮助。

2nbm6dog

2nbm6dog2#

var conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) };
        ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);

这非常好用![BsonIgnoreExtraElements]也很好用,但是,如果你想添加任何其他ConventionRegistry,比如CamelCaseElementNameConvention,那么,它会覆盖属性1,并且发生同样的异常。不确定使用其他属性是否也能实现这一点。

igetnqfo

igetnqfo3#

我在使用动态列表(List)构建过滤器时收到了类似的错误。我将这些行添加到我的数据类中以解决此问题。

[BsonId]
public ObjectId Id { get; set; }
klsxnrf1

klsxnrf14#

这适用于我情况:添加属性

[DataMember]
    [BsonElement("songName")]

元素:

[BsonIgnoreExtraElements]
public class Music
{
   
    [BsonId]
    [DataMember]
    public MongoDB.Bson.ObjectId _id { get; set; }
    [DataMember]
    public string Id { get; set; }

    [DataMember]
    [BsonElement("songName")]
    public string SongName { get; set; }

    [DataMember]
    [BsonElement("artistName")]
    public string ArtistName { get; set; }}
jgzswidk

jgzswidk5#

我遇到了同样的问题。同样的错误发生在var data = query.ToList();

var collection = db.GetCollection<Product>("Products");

        var query =
            from e in collection.AsQueryable<Product>()
            where e.name == "kalem"
            select e;

        var data = query.ToList();

我的插入是这样的:

var collection = db.GetCollection<Product>("Products");

    collection.InsertBatch(products);

我解决如下。

ObjectId id = new ObjectId();
        var collection = db.GetCollection<Product>("Products");

        collection.InsertBatch(products);
        id = pr.Id;

并且我将id添加到Product class中,如下所示

class Product
{
    public ObjectId Id { get; set; }
    public string name { get; set; }
    public string category { get; set; }
    public double price { get; set; }
    public DateTime enterTime { get; set; }
}
8aqjt8rx

8aqjt8rx6#

可以使用BsonNoId属性

[DataContract]
[BsonNoId]
public class Child
{
  [DataMember]
  public string Id { get; set; }

  [DataMember]
  public int Name { get; set; }
}
yruzcnhs

yruzcnhs7#

只需要在类[BsonIgnoreExtraElements]的顶部添加这个

gupuwyp2

gupuwyp28#

您所要做的就是删除ObjectId属性上的[DataMember]并将Id绑定到ObjectId _id。
因此您的类应该如下所示:

[DataContract]
public class Father
{
    [BsonId]
    public MongoDB.Bson.ObjectId _id { get; set; }

    [DataMember]
    public string Id { 
          get { return _id.ToString(); }
          set { _id = ObjectId.Parse(value); }
    }

    [DataMember]
    public List<Child> childs { get; set; }
}

ps:在您的例子中,子id必须手动生成,如果您希望它是一个objectId(mongo),您将不得不做同样的技巧最后,要反序列化对象,您应该使用newtonsoft.json引用,并像这样做

Father = JsonConvert.DeserializeObject<Father>(response.Content);
kupeojn6

kupeojn69#

您的Child类可能应该指定它继承了Father
公共类Child:父亲
您的Father类可能应该添加已知类型属性(对于WCF)。

[DataContract]
[KnownType(typeof(Child))]
public class Father

如果这是一个MongoCollection(“父亲”),您可以通过它来保存/获取,那么您可能需要为每个预期的子类型注册一个类Map。

if (!BsonClassMap.IsClassMapRegistered(typeof(Child)))
{
    BsonClassMap.RegisterClassMap<Child>(
        cm => { cm.AutoMap(); });
}

正如@alexjamesbrown提到的,你不需要将poco对象的id字段命名为'_id'。继承的思想是继承。所以使用Father的“id”字段(不管它被命名为什么)就足够了。不清楚为什么你的Father类同时具有Id和_id属性。其中一个可能是不必要的。

相关问题