MongoLINQプロバイダーが失敗するJSONドキュメントは次のとおりです。
{"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"}
}
「id」フィールドに注意してください。関連するC#エンティティ定義は次のとおりです。
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; }
}
「Twitter」コレクションを作成して上記のドキュメントを保存すると、Mongo LINQプロバイダーを使用してクエリを実行すると、FileFormatException例外がスローされます。「要素'id'はクラスMongo.Context.Testsのフィールドまたはプロパティと一致しません。 NativeTests + Result "
ただし、この問題を修正するための2つの代替回避策があります。
- Resultの「id」フィールドの名前を「idd」に変更します。たとえば、JSONドキュメントとResultクラスの両方で「idd」に変更します。次に、LINQクエリが機能します。
- 「id」フィールドを保持しますが、さらにフィールド「Id」をResultクラスに追加し、属性[BsonId]でマークします。これで、Resultクラスには「Id」フィールドと「id」フィールドの両方が含まれますが、クエリは機能します。
私はMongoAPIを使用してコレクションをクエリしますが、すべてが正常に機能するため、これはMongoDBLINQプロバイダーのバグであるに違いないと思います。ネストされたJSON要素の「id」は予約済みの作品であってはなりませんね。
更新:ネイティブAPIクエリの実行結果は次のとおりです。
> 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"
}
}