0

こんにちは、ユーザー コレクションに MongoDB ドキュメントがあります。

{
   "_id": ObjectId("51d9534fc469880b338903eb"),
   "inbox": {
      "0": {},
      "1": {} ,
      "2": {} 
           ...
    },

}

要件によると、5分ごとに受信トレイをチェックする必要があります。だから私は探しています:

  1. 受信トレイの長さを見つける。
  2. 私の受信トレイの長さは 4 ですが、2 つの新しいメッセージが届いたとします。これらの新しいメッセージだけを取得するにはどうすればよいでしょうか。

少し調査した結果、を使用して受信トレイに新しいメッセージがあるかどうかを確認できることがわかりましたが、db.collection.find({ tags : { $size: 4 }});新しく追加されたメッセージを見つける方法が質問です。この状況を回避するためのより良い方法を提案できれば、本当に素晴らしいことです。

ありがとうございました!

4

2 に答える 2

0

まず、スキーマを設計する最善の方法は、オブジェクトを使用しないことですinbox。配列を使用する必要があります。

第二に、しかしながら、何が新しいメッセージか知っていますか (つまり、4 つのメッセージのうち 2 つが新しいメッセージです)。またはのいずれかreadになるフィールドがあると述べて、私は手足を出しています。truefalse

したがって、あなたが実際に求めているのは、ほとんどの場合、送信日でソートされたすべてのメッセージを取得する方法readですfalseMongoDateまたは、 ( http://php.net/manual/en/class.mongodate.php )lastPullTimeを使用して、値を に保存して追跡することもできます$_SESSION

この例では、readフィールドを対象としています。ISODate()また、という形式の送信日があると仮定しますsent

このために、次のように集計フレームワークを使用できます。

db.collection.aggregate([
    // Let's get our user
    {$match:{_id:ObjectId()}},

    // Now we want to unwind the inbox so we can operate on it
    {$unwind:'$inbox'},

    // Now we want only messages that are not read
    {$match: {'inbox.read':false}},

    // Now lets do our sort by newest
    {$sort: {'inbox.sent':-1}},

    // Now lets group them back up
    {$group: {_id:'$_id', inbox: {$addToSet:'$inbox'}}}
])

または、PHPでasort onを使用して実行できます$doc['inbox']

于 2013-07-08T16:46:25.703 に答える