質問を参照してください。Match conditions and latest date from array良い解決策がNeil Lunnによって提供されています。複雑なMongoクエリ
db.chat.find().pretty().limit(2)
{
"_id" : ObjectId("593921425ccc8150f35e7662"),
"user1" : 1,
"user2" : 2,
"messages" : [
{
"sender" : 1,
"datetime" : ISODate("2017-05-01T00:00:00Z"),
"body" : "hiii 120"
},
{
"sender" : 1,
"datetime" : ISODate("2017-06-01T00:00:00Z"),
"body" : "hiii 121"
},
{
"sender" : 2,
"datetime" : ISODate("2017-06-10T00:00:00Z"),
"body" : "hiii 2"
}
]
}
{
"_id" : ObjectId("593921425ccc8150f35e7663"),
"user1" : 1,
"user2" : 3,
"messages" : [
{
"sender" : 1,
"datetime" : ISODate("2017-05-02T00:00:00Z"),
"body" : "hiii 130"
},
{
"sender" : 1,
"datetime" : ISODate("2017-06-02T00:00:00Z"),
"body" : "hiii 131"
},
{
"sender" : 3,
"datetime" : ISODate("2017-06-10T00:00:00Z"),
"body" : "hiii 2"
}
]
}
ここで問題となるのは、messages.sender = datetimeで1桁のユーザーのリストです。
すなわち 出力:
{
"sender" : 1,
"receiver" : 2,
"datetime" : ISODate("2017-06-02T00:00:00Z"),
"body" : "hiii 131"
},
{
"sender" : 1,
"receiver" : 2,
"datetime" : ISODate("2017-06-01T00:00:00Z"),
"body" : "hiii 121"
},
{
"sender" : 1,
"receiver" : 3,
"datetime" : ISODate("2017-05-02T00:00:00Z"),
"body" : "hiii 130"
},
{
"sender" : 1,
"receiver" : 3,
"datetime" : ISODate("2017-05-01T00:00:00Z"),
"body" : "hiii 120"
},
は、多くのクエリを試みたが、所望の出力を得ることができません。
説明出力:あなたが供給されたデータでテスト
db.chat.find().pretty().limit(2)
{
"_id" : ObjectId("593921425ccc8150f35e7662"),
"user1" : 1,
"user2" : 2,
"messages" : [
{
"sender" : 1,
**"datetime" : ISODate("2017-05-01T00:00:00Z"),**--- message will apear at No4 as sender=1. Also we need data of user1/user2 which is not equal to 1 i.e 2.
"body" : "hiii 120"
},
{
"sender" : 1,
**"datetime" : ISODate("2017-06-01T00:00:00Z"),**--- message will apear at No2 as sender=1. Also we need data of user1/user2 which is not equal to 1 i.e 2.
"body" : "hiii 121"
},
{
"sender" : 2,
"datetime" : ISODate("2017-06-10T00:00:00Z"),
"body" : "hiii 2"
}
]
}
{
"_id" : ObjectId("593921425ccc8150f35e7663"),
"user1" : 1,
"user2" : 3,
"messages" : [
{
"sender" : 1,
**"datetime" : ISODate("2017-05-02T00:00:00Z"),** --- message will apear at No3 as sender=1. Also we need data of user1/user2 which is not equal to 1 i.e 3.
"body" : "hiii 130"
},
{
"sender" : 1,
**"datetime" : ISODate("2017-06-02T00:00:00Z"),** --- message will apear at top as sender=1 and of max datetime. Also we need data of user1/user2 which is not equal to 1 i.e 3.
"body" : "hiii 131"
},
{
"sender" : 3,
"datetime" : ISODate("2017-06-10T00:00:00Z"),
"body" : "hiii 2"
}
]
}
によるソートの必要性についてコメントを読んでいるので、
$sort
を追加します。これは、配列内のコンテンツだけですか?それには何かが行われるはずですか?データをどのように選択するかについて詳しく説明できますか? –はい配列内の内容+送信者ではない他のユーザー...最も重要なのは、メッセージのすべての一致する行の日時に基づいて並べ替える必要があります.... –
もう少し説明的なものを教えてください。あなたは基本的に質問に2つの文章を書いた。それ以上の説明が必要です。たとえば、出力にない項目がソースにあります。読者は出力がどのように達成されているかを理解する必要があります。 –