Skip to content
Advertisement

Looping Over And Array of Objects and Updating Each One

I’m trying to update objects inside an array based on specific conditions that I check using two functions. I couldn’t achieve this with the match feature available in mongoose.

As you can see below, I’m trying to loop over the array of posts, send each post and check if it fulfills a condition, then update it using findOneAndUpdate. The functions isLessThanOne and isAchieved return the expected value.

(async () => {

  let posts = await Post.find()

  posts.map(async (post) => {
    if (isLessThanOneDay(post.deadline)) {
      console.log(post.id, post._id)
      await Post.findOneAndUpdate(post.id, { $set: { category: 'deadline' }})
    } else if (isAchieved(post.milestones)) {
      await Post.findOneAndUpdate(post.id, { $set: { category: 'achieved' }})
    } else {
      await Post.findOneAndUpdate(post.id, { $set: { category: 'newGoals' }})
    }
  })
  
})()

This is the schema

const { type } = require("express/lib/response")
const mongoose = require("mongoose")

const PostSchema = new mongoose.Schema({
    // we have to link or refer each post to a user
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "user",
    },
    title: {
        type: String,
        required: true
    },
    desc: {
        type: String
    },
    milestones: [],
    likes: [
        {
            user: {
                type: mongoose.Schema.Types.ObjectId,
                ref: "user"
            },
            fName: {
                type: String,
                required: true
            },
            date: {
                type: String,
                required: true
            }

        }
    ],
    comments: [
        {
            user: {
                type: mongoose.Schema.Types.ObjectId,
                ref: "user"
            },
            text: {
                type: String,
                required: true
            },
            fName: {
                type: String,
            },
            date: {
                type: String,
            }
        }
    ],
    rewards: [
        {
            user: {
                type: mongoose.Schema.Types.ObjectId,
                ref: "user"
            },
            fName: {
                type: String,
                required: true
            },
            date: {
                type: String,
                required: true
            },
            reward: {
                type: String,
                required: true
            },
            price: {
                type: Number,
                required: true
            }
        }
    ],
    date: {
        type: String,
        required: true
    },
    shares: [
        {
            user: {
                type: mongoose.Schema.Types.ObjectId,
                ref: "user"
            },
            fName: {
                type: String,
                required: true
            },
            date: {
                type: String,
                required: true
            }

        }
    ],
    deadline: {
        type: String,
        required: true
    },
    category: {
        type: String,
    }


}) 

module.exports = Post = mongoose.model('post', PostSchema)

The problem is that I couldn’t update the posts and I’ve already tried using udpate, directly updating it with post.category then save. Any help would appreciated.

Advertisement

Answer

Try this:

(async () => {

  let posts = await Post.find()

  posts.map(async (post) => {
    if (isLessThanOneDay(post.deadline)) {
      console.log(post.id, post._id)
      await Post.findOneAndUpdate({ _id: post.id }, { $set: { category: 'deadline' }})
    } else if (isAchieved(post.milestones)) {
      await Post.findOneAndUpdate({ _id: post.id }, { $set: { category: 'achieved' }})
    } else {
      await Post.findOneAndUpdate({ _id: post.id }, { $set: { category: 'newGoals' }})
    }
  })
  
})()

If I recall, the filter parameter must be an object.

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement