sql >> データベース >  >> NoSQL >> MongoDB

グループカウント2アイテムオブジェクト配列mongodb

    「USER2」は2つしかないため、ユーザーのインデックスで必要な場合は、その_idで$ sum 4$lastを実行できません。compose_idを使用してみてください。

    db.teste.aggregate([
      {$group:{
        _id: {user:"$user",last:"$last"},
        total: {$sum:1},
        last: {
          $sum: {
            $cond:[ {$eq: ["$last", user]}, 1, 0]
          }
        }
      }}
    ])
    

    別のフィールドに文字列またはその他のオカレンスを追加する必要がある場合。クエリは次のとおりです:

    db.teste.aggregate([
      {$group:{
        _id: "$user"
      }},
      {$lookup:{
        from: "teste",
        let: { indice: "$_id" },
        pipeline: [
          {$group:{
            _id: null,
            user:{$sum:{$cond:[
              {$eq:["$user", "$$indice"]}, 1, 0
            ]}},
            last:{$sum:{$cond:[
              {$eq:["$last", "$$indice"]}, 1, 0
            ]}}
          }},
          {$project:{
            _id: 0
          }}
        ],
        as: "res"
      }}
    ])
    

    ゼロからヒーローへ:

    //First we'll extract only what we need find, on this case distinct users
    db.teste.aggregate([
      {$group:{
        _id: "$user"
      }}
    ])
    
    //Here we will get the indexes of the search and reinsert in our filter using $let (nodejs var)
    db.teste.aggregate([
      {$group:{
        _id: "$user"
      }},
      {$lookup:{
        from: "teste",
        let: { indice: "$_id" },
        pipeline: [],
        as: "res"
      }}
    ])
    
    //Let's counter the total of reinserted elements
    db.teste.aggregate([
      {$group:{
        _id: "$user"
      }},
      {$lookup:{
        from: "teste",
        let: { indice: "$_id" },
        pipeline: [
          {$group:{
            _id: null,
            total:{$sum:1}
          }}
        ],
        as: "res"
      }}
    ])
    
    //Now let's test a true condition
    db.teste.aggregate([
      {$group:{
        _id: "$user"
      }},
      {$lookup:{
        from: "teste",
        let: { indice: "$_id" },
        pipeline: [
          {$group:{
            _id: null,
            user:{$sum:{$cond:[
              {$eq:[true, true]}, 1, 0
            ]}}
          }}
        ],
        as: "res"
      }}
    ])
    
    //cond tested let's extract what we want
    db.teste.aggregate([
      {$group:{
        _id: "$user"
      }},
      {$lookup:{
        from: "teste",
        let: { indice: "$_id" },
        pipeline: [
          {$group:{
            _id: null,
            user:{$sum:{$cond:[
              {$eq:["$user", "$$indice"]}, 1, 0
            ]}},
            last:{$sum:{$cond:[
              {$eq:["$last", "$$indice"]}, 1, 0
            ]}}
          }}
        ],
        as: "res"
      }}
    ])
    
    //Let's take the _id of the sub-colection because we do not need it
    db.teste.aggregate([
      {$group:{
        _id: "$user"
      }},
      {$lookup:{
        from: "teste",
        let: { indice: "$_id" },
        pipeline: [
          {$group:{
            _id: null,
            user:{$sum:{$cond:[
              {$eq:["$user", "$$indice"]}, 1, 0
            ]}},
            last:{$sum:{$cond:[
              {$eq:["$last", "$$indice"]}, 1, 0
            ]}}
          }},
          {$project:{
            _id: 0
          }}
        ],
        as: "res"
      }}
    ])
    



    1. なぜmongodbで$allを使用するのがはるかに遅いのですか?

    2. Redisのフィルタリング要素

    3. MongoDBのデプロイメントパターンの比較

    4. 意図しないmongoバージョンのアップグレード後の古いmongoデータベースのアップグレード