0

私はプライベートメッセージを保存するためにmongoを使用しています.例えば、私は次のような配列を持っています:

{
  "_id": { "$oid" : "520b842005ab0d0000000003" },
  "pmhistory": [
    {
      "sendername": "Tati",
      "preview": "Hey Man!",
    },
    {
      "sendername": "Dan",
      "preview": "Hey Moon!",
    },
    {
      "sendername": "Hellen",
      "preview": "Hello, Im proper!",
    },
  ],
  "user": { "$oid" : "520b842005ab0d0000000002" },
  "userid": "1"
}

Dan が新しいメッセージを送信した場合、彼の配列エントリを位置 0 (pmhistory[0]) に移動し、プレビュー フィールドを更新する必要があります。

ここで、データベースに対して 2 つのクエリを発行する必要があります。1 つはパラメーターを使用して配列$pullから Dans エントリを取り出し、もう 1 つは Dans エントリを配列の先頭に追加するパラメーターを使用します。pmhistory$setpmhistory

2 つではなく 1 つのクエリを使用することは可能ですか? have conflicting mods in update配列のサイズを変更しているため、取得せずに。

4

2 に答える 2

1

そもそも配列の順序に依存しないのが最も簡単だと思います。私がすることは、次のように、各サブドキュメントに「last_update」フィールドを追加することです。

{
  "_id": { "$oid" : "520b842005ab0d0000000003" },
  "pmhistory": [
    {
      "sendername": "Tati",
      "preview": "Hey Man!",
      "last_updated": 1376581408222,
    },
    {
      "sendername": "Dan",
      "preview": "Hey Moon!",
      "last_updated": 1376581406444,
    },
    {
      "sendername": "Hellen",
      "preview": "Hello, Im proper!",
      "last_updated": 1376581508111,
    },
  ],
  "user": { "$oid" : "520b842005ab0d0000000002" },
  "userid": "1"
}

findAndModify次に、ダンに新しいメッセージが届いたら、次のように実行できます。

db.so.findAndModify( { 
    query: { "pmhistory.sendername" : "Dan" }, 
    update: { 
        $set: { "pmhistory.$.last_updated" : (new Date).getTime() } 
    }, 
    new: true 
} );

次に戻ります:

{
    "_id" : ObjectId("520cf82fd3541122f936f72e"),
    "pmhistory" : [
        {
            "sendername" : "Tati",
            "preview" : "Hey Man!",
            "last_updated" : 1376581408
        },
        {
            "sendername" : "Dan",
            "preview" : "Hey Moon!",
            "last_updated" : 1376581716876
        },
        {
            "sendername" : "Hellen",
            "preview" : "Hello, Im proper!",
            "last_updated" : 1376581508
        }
    ],
    "user" : ObjectId("520b842005ab0d0000000002"),
    "userid" : "1"
}

次に、アプリケーションの表示部分で、この新しいlast_updatedフィールドが降順であることを確認してください。

于 2013-08-15T15:50:48.863 に答える
0

$push を $slice と組み合わせて使用​​すると、配列のサイズを修正して最後の要素を削除できます。

http://docs.mongodb.org/manual/reference/operator/slice/

于 2013-08-15T11:36:58.920 に答える