Ecco un documento JSON in cui Mongo fornitore di LINQ fallisce:strano comportamento del fornitore MongoDB LINQ per i campi chiamato "id"
{"results":
{"text":"@twitterapi http://tinyurl.com/ctrefg",
"to_user_id":396524,
"to_user":"TwitterAPI",
"from_user":"jkoum",
"metadata":
{
"result_type":"popular",
"recent_retweets": 109
},
"id":1478555574,
"from_user_id":1833773,
"iso_language_code":"nl",
"source":"<a href=\"http://twitter.com/\">twitter<\/a>",
"profile_image_url":"http://s3.amazonaws.com/twitter_production/profile_images/118412707/2522215727_a5f07da155_b_normal.jpg",
"created_at":"Wed, 08 Apr 2009 19:22:10 +0000",
"since_id":0,
"max_id":1480307926,
"refresh_url":"?since_id=1480307926&q=%40twitterapi",
"results_per_page":15,
"next_page":"?page=2&max_id=1480307926&q=%40twitterapi",
"completed_in":0.031704,
"page":1,
"query":"%40twitterapi"}
}
nota un campo "id". Qui sono correlate C# definizioni di entità:
class Twitter
{
[BsonId]
public ObjectId Id { get; set; }
public Result results { get; set; }
}
private class Result
{
public string text { get; set; }
public int to_user_id { get; set; }
public string to_user { get; set; }
public string from_user { get; set; }
public Metadata metadata { get; set; }
public int id { get; set; }
public int from_user_id { get; set; }
public string iso_language_code { get; set; }
public string source { get; set; }
public string profile_image_url { get; set; }
public string created_at { get; set; }
public int since_id { get; set; }
public int max_id { get; set; }
public string refresh_url { get; set; }
public int results_per_page { get; set; }
public string next_page { get; set; }
public double completed_in { get; set; }
public int page { get; set; }
public string query { get; set; }
}
class Metadata
{
public string result_type { get; set; }
public int recent_retweets { get; set; }
}
se creo una collezione "Twitter" e salvare il documento di cui sopra, poi quando interrogo utilizzando provider di Mongo LINQ, si genera un'eccezione FileFormatException: "Element 'id' non corrisponde ad alcun campo o la proprietà di classe Mongo.Context.Tests.NativeTests + Risultato"
Tuttavia ci sono due soluzioni alternative per risolvere questo problema:
- Rinomina Risultato 'campo id', ad esempio, a "idd" sia in JSON doc che nella classe Result. Quindi la query LINQ funziona.
- Mantieni il campo "id" ma aggiungi anche un campo "Id" alla classe Result e contrassegnalo con l'attributo [BsonId]. Ora la classe Result contiene entrambi i campi "Id" e "id", ma la query funziona!
Io uso l'API di Mongo per interrogare la raccolta, tutto funziona correttamente, quindi suppongo che questo debba essere un bug in un provider LINQ MongoDB. "id" in un elemento JSON annidato non dovrebbe essere un lavoro riservato, dovrebbe?
UPDATE: Ecco il risultato di un'esecuzione di query API native:
> db.Twitter.find().limit(1);
{ "_id" : ObjectId("50c9d3a4870f4f17e049332b"),
"results" : {
"text" : "@twitterapi http://tinyurl.com/ctrefg",
"to_user_id" : 396524,
"to_user" : "TwitterAPI",
"from_user" : "jkoum",
"metadata" : { "result_type" : "popular", "recent_retweets" : 109 },
"id" : 1478555574,
"from_user_id" : 1833773, "
iso_language_code" : "nl",
"source" : "<a href=\"http://twitter.com/\">twitter</a>",
"profile_image_url" : "http://s3.amazonaws.com/twitter_production/profile_images/118412707/2522215727_a5f07da155_b_normal.jpg",
"created_at" : "Wed, 08 Apr 2009 19:22:10 +0000",
"since_id" : 0,
"max_id" : 1480307926,
"refresh_url" : "?since_id=1480307926&q=%40twitterapi", "results_per_page" : 15, "next_page" : "?page=2&max_id=1480307926&q=%40twitterapi",
"completed_in" : 0.031704,
"page" : 1,
"query" : "%40twitterapi"
}
}
+1 per soluzioni alternative - grazie. È interessante notare che sembra che l'errore venga sollevato solo se un oggetto con istanza singola contiene un campo 'id'. Un elemento figlio 'Elenco' con' id' non ha avuto problemi. – StuartLC