Mongoose'daki koleksiyonlardaki alan değerleri nasıl toplanır

0

Soru

const PostSchema = new mongoose.Schema({
  title: {
    type: String,
  },
  text: {
    type: String,
    required: true,
  }
  postedBy: {
    type: mongoose.Schema.ObjectId,
    ref: "User",
  }
  likes: [{
    type: mongoose.Schema.ObjectId,
    ref: "User",
  }, ],
  likeLength: {
    type: Number,
    default: 0
  }
});


let totalLikes = Post.aggregate([{
    $match: {
      postedBy: req.profile._id,
    },
  },
  {
    $group: {
      _id: "$postedBy",
      total_count: {
        $sum: "$likeLength"
      }
    }
  },
])

postedBy alanına göre filtrelenen tüm Post koleksiyonlarındaki likeLength değerlerini toplamak ve hangi tamsayı türünde özetlenmiş sonucu elde etmek istedim. Yukarıdaki totalLikes işlevini denedim ancak başaramadım.

javascript mongodb mongoose node.js
2021-11-23 17:31:51
2
0

Belki bu yardımcı olabilir

  • dize yap req.profile._id ObjectId için
  • gruplandır null hepsi aynı gelen postedBy yani geçen tüm belgeler gruptadır. (group by null, tüm koleksiyon 1 grubu anlamına gelir) (grubunuz da iyiydi, ancak bu daha basit)
  • ayarı kaldır _id sonuç olarak elde etmek için [{"total_count" : 20}] örneğin

* grup testini test etmeden önce $match eserler ve belgeler bulunur.

let totalLikes = Post.aggregate([{
    $match: {
      postedBy: mongoose.Types.ObjectId(req.profile._id),
    }
  },
  {
    $group: {
      _id: null,
      total_count: {
        $sum: "$likeLength"
      }
    }
  },
  {"$unset": ["_id"]}
])
2021-11-23 18:51:11

Çok teşekkür ederim. Ayrıca bu işlevle de yaptım $group: { _id: "$postedBy", sumLikes: {$sum: {$size: "$likes" }}} Ama bu verileri nasıl alabilirim , tamsayı demek istiyorum ve bu numarayı istemciye gönderebilirim?
jdee

sorgular her zaman belge dizilerini (veya hiçbir şey bulunamazsa boş diziyi) döndürür. Alabilirsiniz en yakın bu var [{total_count : 20 }] bunu isterseniz kaldırabilirsiniz _id ile project veya unset
Takis _

Çok teşekkür ederim ve zamanınızı boşa harcadığım için gerçekten üzgünüm ama sanırım bu benim sorunum değil. İstemcide react kullanıyorum ve bu verileri sunucudan aldığımda bununla karşılaşıyorum {_pipeline: Array(3), options: {...}} öyleyse numarama nasıl ulaşabilirim :). Ancak, muhtemelen web sitesinin formatı nedeniyle bunun için yeni bir soru sormam gerekiyor.
jdee

toplamalar imleçleri döndürür ve birçok yöntemi vardır, bunlardan biri basittir toArray() ve oradan sonra onları js ile alırsın. firavun faresi belgelerine bakın
Takis _

aslında bunları kullanıyorum ama sonuç yok 1) konsol.günlük (istatistikler?._pipeline?.map ((item) = > (><p > {item[1]} <p > < / p>) ve 2) istatistikler._pipeline[1]
jdee

js ile ilgili sorunlarınız varsa, belki yeni bir soru sorun, genel olarak java / clojure kullanıyorum, ancak birçok kişi yardımcı olabilir
Takis _

Teşekkür ederim, buna bakacağım ve başaramazsam yeni bir soru soracağım . Tekrar teşekkür ederim
jdee
0

Bunun çözümü aşağıdaki gibidir. Sonuç [0] ile sonuç sumLikes özelliğine sahip bir nesne olacaktır.

aggregate([
      {
        $match: {postedBy: req.profile._id}
      },
      {
        $group: {
          _id: null,
          sumLikes: {
            $sum: "$likeLength",
          },
        },
      },
      { $unset: ["_id"] },
    ], function(err, result) {
      if(err){
        console.log(err)
      }else{
        res.json(result[0])
      }})

2021-11-23 18:35:38

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................