sql >> Databasteknik >  >> NoSQL >> MongoDB

Konstigt beteende hos MongoDB LINQ-leverantör för fält som kallas id

MongoDB kräver att varje dokument som lagras i databasen har ett fält (på rotnivå) som heter "_id".

C#-drivrutinen antar att alla fält i din klass som heter "Id", "id" eller "_id" är avsedda att mappas till det speciella "_id"-fältet. Detta är en konvention som kan åsidosättas. C#-drivrutinen vet inte att din resultatklass inte är avsedd att användas som rotdokument för en samling, så den hittar ditt "id"-fält och mappar det till "_id" i databasen.

Ett sätt du kan åsidosätta detta är att ändra namnet på fältet i din klass (som du upptäckt). Vad du då också kan göra är att använda [BsonElement]-attributet för att mappa ditt C#-fältnamn (t.ex. "idd") till det namn som faktiskt används i databasen (t.ex. "id"). Till exempel:

public class Result
{
    [BsonElement("id")]
    public int idd; // matches "id" in the database
    // other fields
}

Ett annat alternativ är att åsidosätta konventionen som hittar "Id"-medlemmen i en klass för att undertrycka standardbeteendet för C#-drivrutinen för din resultatklass. Du kan göra detta genom att registrera en ny ConventionProfile för din resultatklass. Till exempel:

var noIdConventions= new ConventionProfile();
noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));

Du måste se till att göra detta mycket tidigt i ditt program, innan din resultatklass kartläggs.



  1. render_template med flera variabler

  2. Lägga till/subtrahera dagar till ISODate i MongoDB Shell

  3. MongoDB $aggregate $push flera fält i Java Spring Data

  4. Mongodb-frågan långsam med punktnotation