Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

Trying to figure out something simple in this aggregation. The field "totalArrests" under metadata is coming back 0. It's not able to sum this field from the previous stage for some reason. Please advise.

const agg = await KID.aggregate([
            $group: {
                _id: "$source", // group by this
                title: { "$last": "$title"},
                comments: { "$last": "$comments"},
                body: { "$last": "$body"},
                date: { "$last": "$date"},
                media: { "$last": "$media"},
                source: { "$last": "$source"},
                count: { "$sum": 1},
                arrestCount: { "$sum": "$arrested"},
                rescuedCount: { "$sum": "$rescued"},
        // sorting
            $sort: {date: sort}
        // facets for paging
            $facet: {
                metadata: [ 
                    { $count: "total" },  // Returns a count of the number of documents at this stage
                    { $addFields: { 
                        page: page, 
                        limit: 30,
                        totalArrests: {$sum: "$arrestCount"}
                kids: [ { $skip: (page-1)*30 }, { $limit: 30 } ]

Here is a sample document in the collection.

_id: 5e8b922aaf5ccf5ac588398c, counter: 4, date: 2017-01-01T17:00:00.000Z, name: 'Steven Tucker', arrested: 1, rescued: 0, country: 'US', state: 'NH', comments: 'Sex trafficking of a minor', source: 'https://www.justice.gov/opa/pr/new-hampshire-man-indicted-sex-trafficking-minor-connection-interstate-prostitution', title: 'New ....', body: 'Steven Tucker, 31, ....', __v: 0, media: { title: 'New Hampshire Man Indicted for Sex ...', open_graph: [Object], twitter_card: [Object], favicon: 'https://www.justice.gov/sites/default/files/favicon.png' id: 5e8b922aaf5ccf5ac588398c, text: 'New Hampshire Man Indicted', utcDate: '2017-01-01T12:00'

$count will only provide you the count for number of documents and escapes all the other things.

So, You have to use one more pipeline in $facet in order to get the documents.

{ $facet: {
  metadata: [
    { $group: {
      _id: null,
      total: { $sum: 1 },
      totalArrested: { $sum: "$arrestCount" }
    { $project: {
      total: 1,
      totalArrested: 1,
      page: page,
      limit: 30,
      hasMore: { $gt: [{ $ceil: { $divide: ["$total", 30] }}, page] }
  kids: [{ $skip: (page-1) * 30 }, { $limit: 30 }]
                Very nice.  I had to use AddFields to make it work.  { $addFields: { 						page: page, 						limit: 30, 						hasMore: { $gt: [{ $ceil: { $divide: ["$total", 30] }}, page] } 					}}, 					{ $project: { 						total: 1, 						totalArrested: 1, 						totalRescued: 1, 						page: 1, 						limit: 1, 						hasMore: 1, 					}}
– user2001702
                Apr 30, 2020 at 21:02
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.