0

次のようなデータがあります。

{
"_id" : "5227aa5d9881d31cd3aa0e78",
"Message" : "This is a message 5:47 PM",
"IssuedAt" : ISODate("2013-09-04T21:47:09.932Z"),
"Users" : [
    {
        "_id" : "dhBHuZL9M+hqtKIx14iu",
        "IsRead" : true
    },
    {
        "_id" : "SOMSOMOMODJFJDFKJKDJF",
        "IsRead" : false
    }
]
}

そして、1人のユーザーについて次の情報を取得することを望んでいました:

{
  "_id" : "5227aa5d9881d31cd3aa0e78",
  "Message" : "This is a message 5:47 PM",
  "IssuedAt" : ISODate("2013-09-04T21:47:09.932Z"),
  "IsRead" : false
}

私はこれを試しましたが、サブドキュメント全体を含むレコードのみを返します:

db.collection.find({"Users": {$elemMatch: {"_id": 'dhBHuZL9M+hqtKIx14iu'}}}, {"Message": 1, "Users.$.IsRead": 1}).pretty()

集計を使用せずに探しているものを取得する方法はありますか?

4

1 に答える 1

0

現在の要件では、スキーマを再設計する必要があると思います。スキーマは、クエリに対してより効率的でなければなりません。現在の要件のスキーマは、ユーザーコレクションを持つことです。

                 { 
                  "_id": "dhBHuZL9M+hqtKIx14iu" ,
                   "Name" : "Test",
                    "ReadMessages" [{}],
                    "UnReadMessage" [{}]
                 }

これで、すべてのユーザーにとって、既読メッセージと未読メッセージを非常に簡単に取得できます。メッセージを UnRead から Read に移動するために実行する必要がある 1 つの更新ステートメント。しかし、それは一度発生し、残りの読み取りは非常に高速になります。問題が解決しないことはわかっていますが、スキーマを変更したい場合に役立つ場合があります。

于 2013-09-05T06:24:53.000 に答える