MongoDBの同じ配列から2つのフィールドを持つドキュメントを返す

ヤニック・ロション

次のような特定のドキュメント

{
  _id: 'abcd',
  userId: '12345',
  activities: [
    { status: 'login', timestamp: '10000001' },
    { status: 'logout', timestamp: '10000002' },
    { status: 'login', timestamp: '10000003' },
    { status: 'logout', timestamp: '10000004' },
  ]
}

2つのタイムスタンプの間に最新のログイン/ログアウトアクティビティが記録されているすべてのユーザーが返されるようなパイプラインを作成しようとしています。たとえば、2つのタイムスタンプ値がとの間10000002にある10000003場合、期待されるドキュメントは次のようになります。

{
  _id: 'abcd',
  userId: '12345',
  login: '10000003',
  logout: '10000002'
}

2つのタイムスタンプ値がとの間-1にある10000001場合、予想されるドキュメントは次のようになります。

{
  _id: 'abcd',
  userId: '12345',
  login: '10000001',
  logout: null
}

等。

集計に関係していることはわかっていますし、必要なこと$unwindなどもありますが、残りの部分、つまり同じドキュメント配列から2つのフィールドを評価することについてはよくわかりません

mickl

以下の集計を試すことができます。

db.col.aggregate([
    { 
        $unwind: "$activities" 
    },
    {
        $match: {
            $and: [
                { "activities.timestamp": { $gte: "10000001" } },
                { "activities.timestamp": { $lte: "10000002" } }
            ]
        }
    },
    {
        $sort: {
            "activities.timestamp": -1
        }
    },
    {
        $group: {
            _id: "$_id",
            userId: { $first: "$userId" },
            activities: { $push: "$activities" }
        }
    },
    {
        $addFields: {
            login: { $arrayElemAt: [ { $filter: { input: "$activities", as: "a", cond: { $eq: [ "$$a.status", "login" ] } } } , 0 ] },
            logout: { $arrayElemAt: [ { $filter: { input: "$activities", as: "a", cond: { $eq: [ "$$a.status", "logout" ] } } } , 0 ] }
        }
    },
    {
        $project: {
            _id: 1,
            userId: 1,
            login: { $ifNull: [ "$login.timestamp", null ] },
            logout: { $ifNull: [ "$logout.timestamp", null ] }
        }
    }
])

私たちは、使用する必要があります$アンワインド+ $ソート+ $グループを私たちの活動は、タイムスタンプでソートされますことを確認します。$ match$unwind使用してフィルタリング条件を適用した次に、$ filter$ arrayElemAtとともに使用して、フィルター処理された配列の最初の(最新の)値を取得できます最後に、明示的に$ ifNullを使用できます(そうしないと、値がない場合にJSONキーがスキップされます)$project

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じドキュメント内の2つの配列フィールドを比較します

分類Dev

Mongodb:複数の同じ指定値を含む配列フィールドを持つドキュメントを検索します

分類Dev

同じフィールドを1つ持つmongodbドキュメントをクエリする方法

分類Dev

1つのフィールドの配列でmongodbのドキュメントを検索しますか?

分類Dev

MongoDB:異なるフィールドを持つ異なるドキュメントからデータを返す単一の検索リクエスト

分類Dev

MongoDB-配列内の複数のオブジェクトから同じフィールドでドキュメントをクエリします

分類Dev

ドキュメントを更新し、コレクションMongoDB内の同じIDを持つすべてのオブジェクトの配列であるフィールドを作成します

分類Dev

同じ値を持つドキュメントの数をカウントし、mongoDBの別のフィールドを使用してそれらをグループ化するにはどうすればよいですか?

分類Dev

同じドキュメントの2つのフィールドを比較する

分類Dev

mongodbのサブドキュメント配列の2つの特定のフィールド値を一致させる方法はありますか?

分類Dev

配列を持つドキュメントを返す方法は、同様のフィールドを持つ複数のオブジェクトを含みます

分類Dev

同じ署名者の2つの署名フィールドを同じドキュメントに追加するにはどうすればよいですか?

分類Dev

MgoのMongodbで他のいくつかのフィールドと共にサブドキュメント配列フィールドを更新する方法は?

分類Dev

Spring MongoDB:2つの等しいフィールドを持つドキュメントのクエリ

分類Dev

MongoDBは、2つのサブドキュメントからフィールドを計算し、新しいドキュメントを生成します

分類Dev

サブドキュメントをMongoDBの特定のフィールドを持つドキュメントと結合することは可能ですか?

分類Dev

非配列フィールドを持つ配列要素クエリのいずれかに等しいドキュメントを検索します

分類Dev

ElasticSearchで2つのドキュメントの配列フィールドの共通値を見つける

分類Dev

MongoDB:ドキュメント内の複数の配列をフィルタリングしてから、重複する配列を1つのデータに返します

分類Dev

MongoDBのフィールドの最大値を持つドキュメントを取得します

分類Dev

mongodb-多くのドキュメントから1つの配列フィールドへの配列フィールドの連結

分類Dev

サブドキュメントからフィールドの配列を返す

分類Dev

2つの値を持つフィールドを持つmongodbコレクションでドキュメントを見つける方法は?

分類Dev

2つのフィールドを持つMongoDB集約配列

分類Dev

ScalaのMongoDBから配列にドキュメントフィールドを収集する

分類Dev

MongoDBから配列フィールドのキーを返す

分類Dev

MongoDB:2つのネストされた配列を持つドキュメントの平均を更新する

分類Dev

同じキーを持つドキュメントをマージするためのMongodbクエリ

分類Dev

特定の番号フィールドmongodbを持つドキュメントを検索する

Related 関連記事

  1. 1

    同じドキュメント内の2つの配列フィールドを比較します

  2. 2

    Mongodb:複数の同じ指定値を含む配列フィールドを持つドキュメントを検索します

  3. 3

    同じフィールドを1つ持つmongodbドキュメントをクエリする方法

  4. 4

    1つのフィールドの配列でmongodbのドキュメントを検索しますか?

  5. 5

    MongoDB:異なるフィールドを持つ異なるドキュメントからデータを返す単一の検索リクエスト

  6. 6

    MongoDB-配列内の複数のオブジェクトから同じフィールドでドキュメントをクエリします

  7. 7

    ドキュメントを更新し、コレクションMongoDB内の同じIDを持つすべてのオブジェクトの配列であるフィールドを作成します

  8. 8

    同じ値を持つドキュメントの数をカウントし、mongoDBの別のフィールドを使用してそれらをグループ化するにはどうすればよいですか?

  9. 9

    同じドキュメントの2つのフィールドを比較する

  10. 10

    mongodbのサブドキュメント配列の2つの特定のフィールド値を一致させる方法はありますか?

  11. 11

    配列を持つドキュメントを返す方法は、同様のフィールドを持つ複数のオブジェクトを含みます

  12. 12

    同じ署名者の2つの署名フィールドを同じドキュメントに追加するにはどうすればよいですか?

  13. 13

    MgoのMongodbで他のいくつかのフィールドと共にサブドキュメント配列フィールドを更新する方法は?

  14. 14

    Spring MongoDB:2つの等しいフィールドを持つドキュメントのクエリ

  15. 15

    MongoDBは、2つのサブドキュメントからフィールドを計算し、新しいドキュメントを生成します

  16. 16

    サブドキュメントをMongoDBの特定のフィールドを持つドキュメントと結合することは可能ですか?

  17. 17

    非配列フィールドを持つ配列要素クエリのいずれかに等しいドキュメントを検索します

  18. 18

    ElasticSearchで2つのドキュメントの配列フィールドの共通値を見つける

  19. 19

    MongoDB:ドキュメント内の複数の配列をフィルタリングしてから、重複する配列を1つのデータに返します

  20. 20

    MongoDBのフィールドの最大値を持つドキュメントを取得します

  21. 21

    mongodb-多くのドキュメントから1つの配列フィールドへの配列フィールドの連結

  22. 22

    サブドキュメントからフィールドの配列を返す

  23. 23

    2つの値を持つフィールドを持つmongodbコレクションでドキュメントを見つける方法は?

  24. 24

    2つのフィールドを持つMongoDB集約配列

  25. 25

    ScalaのMongoDBから配列にドキュメントフィールドを収集する

  26. 26

    MongoDBから配列フィールドのキーを返す

  27. 27

    MongoDB:2つのネストされた配列を持つドキュメントの平均を更新する

  28. 28

    同じキーを持つドキュメントをマージするためのMongodbクエリ

  29. 29

    特定の番号フィールドmongodbを持つドキュメントを検索する

ホットタグ

アーカイブ