1

Facebook Graph APIにアクセスして、フィード(Facebookウォール)の最新の投稿を表すJSONオブジェクトを取得しました。次に、PHP Mongo Driverを使用して、フィードと呼ばれるMongoDBコレクションに保存しました。

//$post['feed']['data'] contains the Facebook JSON object of wall posts
//create a mongo instance
$mongo = new Mongo();
//access the feeds collection
$feeds = $mongo->changeup->feeds;
//dump the feed right into mongo
$feeds->insert($post['feed']['data']);

これは、mongoに配置されたオブジェクト全体を読み戻した後の配列の1つです。

1つだけを示していますが、さらにいくつかのインデックスが付けられ、次は[1] => Array()などです... [story]フィールドが含まれているため、構造が異なるものもあります。その他には[メッセージ]フィールドが含まれ、一部には両方が含まれます。

Query:
$cursor = $feeds->find();

foreach ( $cursor as $feed ) { 
print_r($feed);
}

Result:
[0] => Array
        (
            [id] => 505212695_10150696450097696
            [from] => Array
                (
                    [name] => John Doe
                    [id] => 505212695
                )

            [story] => "Text of a story I posted on my wall..."
            [story_tags] => Array
                (
                    [38] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 15212444
                                    [name] => John Doe
                                    [offset] => 38
                                    [length] => 10
                                    [type] => user
                                )

                        )

                )

            [type] => status
            [application] => Array
                (
                    [name] => Share_bookmarklet
                    [id] => 5085647995
                )

            [created_time] => 2012-04-04T05:51:21+0000
            [updated_time] => 2012-04-04T05:51:21+0000
            [comments] => Array
                (
                    [count] => 0
                )

)

問題は、コレクション全体を検索するだけではなく、[message]フィールドと[story]フィールドを含む配列のみを検索し、その内容だけを検索することです。

2レベルの深さのサブセットを受信しようとしています。

//this works, however, I'm only able to get the 0 array 
$cursor = $feeds->find( array(), array('0.story' => true) );

すべての配列でフィルタリングするにはどうすればよいですか?

最終結果を次のようにしたいと思います。

Array
(
    [_id] => MongoId Object
        (
            [$id] => 4f7db4dd6434e64959000000
        )

    [0] => Array
        (
            [story] => "Text of a story I posted on my wall..."
        )
    [1] => Array
        (
            [story] => "Text of a story I posted on my wall..."
        )
    [2] => Array 
        (
            [story] => "Text of a story I posted on my wall..."
            [message] => "In this case message text exists as well..."
        )
    [3] => Array
        (
            [message] => "Text of a message I posted on my wall..."
        )

    etc...
)
4

2 に答える 2

2

最初の問題は、各フィード ドキュメントのデータ構造から始まると思います。オブジェクトは単なる id であり、数値キーの増分量であることに注意してください。それだけです。理想的なのは、キーと値を持つ実際のオブジェクト構造を最上位に挿入することです。現在、facebook データをフォーマットせずに直接 mongo に直接ダンプしたため、ドライバーは配列をキー/値にマップしました。これで、各フィード ドキュメントにはさまざまな量の匿名オブジェクトが含まれるようになりました。

これを参照してください: http://www.php.net/manual/en/mongo.writes.php

フィード ドキュメントは次のようになると思います。

{ 
    "_id" : ObjectId("4f7db4dd6434e64959000000"), 
    "posts" : 
    [
        {
            "story" : "Text of a story I posted on my wall...",
            "message" : "In this case message text exists as well...",
        },
        {
            "story" : "Text of a story I posted on my wall...",
            "message" : "In this case message text exists as well...",
        }
    ],
    "posts_meta1": "some val",
    "posts_meta2": "other data"
}

「posts」の最上位キーが含まれており、その下に投稿オブジェクトの配列があることに注意してください。これにより、複数の問題が修正されます。「数値」の代わりに索引付けするトップレベルのキーがあり、フィード フィールドを追加するためのよりクリーンなルート レベルがあり、検索クエリをきれいに実行できます。

簡単な検索は次のようになります。

// Return all feed docs, and only include the posts.story field
db.feeds.find({}, {"posts.story": 1})

より高度なクエリは次のようになります。

// Return an feed document that either contains a posts.story
// field, or, contains a posts.message field
db.feeds.find({
    $or: [ 
        {$exists: {"posts.story": true}}, 
        {$exists: {"posts.message": true} 
    ]
})

簡単に言うと、facebook から返されたデータは、最初にオブジェクト構造にフォーマットしてから、mongo に挿入する必要があります。たとえば、生の文字列ではなく、適切な日付オブジェクトとして日付を挿入する必要があります: http://www.php.net/manual/en/class.mongodate.php。これにより、mongo で日付ベースのクエリを実行できます。また、php ドライバーは、それらが言語によりネイティブになるように相互に変換することも確認します。

于 2012-04-05T17:06:32.863 に答える
1

Facebook から送信された JSON データを見ないと、story_tags フィールドの構造がどのように見えるべきかを判断するのは困難です。Facebook からの JSON をデコードし、json_decode を強制的に PHP 連想配列に変換する必要がある場合があります。

$ar = json_decode($post['feed']['data'], true);

ここで「true」フラグを指定すると、データが連想配列として処理されます。

次に、次のように挿入します。

$feeds->insert($ar);

いずれにせよ、データベースに格納する前に、ニーズに合わせてデータを再構築する傾向があります。これにより、とりわけインデックスをより効果的に使用できるようになります。Facebook からの応答全体を本当に保存する必要がある場合は、ネストされたオブジェクトとしていつでも保存できます。

$ar['raw'] = $post['feed']['data'];
于 2012-04-05T18:15:34.650 に答える