Home > Mobile >  Node JS, Mongoose How to query schema via aggregate?
Node JS, Mongoose How to query schema via aggregate?

Time:08-04

I am new to using MongoDB and I am trying to update update my document using aggregate $set pipeline. However I have been trying this for a few days and there is still no success. I am trying to update by querying ObjectId and replacing matched result (singular) with the key value pair I specified. I tested the aggregate on Mongo Compass and it works. Does anyone know how to use aggregate for Node JS?

updateOne query I tried

let query = {"_id": ObjectId('theObjectIamUpdating')};
response = await newForm.updateOne(query, payload);

aggregate query I tried

response = await newForm.updateOne([
      {$match: {"_id": ObjectId(update_id)}},
      {$set: {
        "data.velo": [
            [1, 2, 3], [5, 7]
          ]
      }}
    ]);

newForm Mongoose Schema

data: {
        date: {
            type: Array,
            required: false,
            trim: true,
        },
        speed: {
            type: Array,
            required: false,
            trim: true,
        },
        velo: {
            type: Array,
            required: false,
            trim: true,
        }
    },
calc: {
        date: {
            type: Array,
            required: false,
            trim: true,
        },
        speed: {
            type: Array,
            required: false,
            trim: true,
        },
        velo: {
            type: Array,
            required: false,
            trim: true,
        }
    }

UPDATE I my updateOne() has succeeded, but my documents are not getting updated.

the result I got after logging response that I awaited

Data received  {
  acknowledged: true,
  modifiedCount: 0,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 0
}
POST /api/compute/calculate 200 16 - 79.821 ms

Additionally, this is the MongoDB aggregate that worked when I tried on Mongo Compass

pipeline = $match > $set

**$match**
{
  "_id": ObjectId('62e2295060280132dbcee4ae')
}
**$set**
{
  "data.velo": [
      [1, 2, 3], [5, 7]
    ]
}

where velo is one of the key value pairs in data, and the set result replaced only the data in data.velo.

CodePudding user response:

As prasad_ mentioned in the comment section, I indeed found some mistakes with regards to my syntax of updateOne().

Correct Syntax for updateOne()

let response = await Form_csv_metadata2.updateOne({ '_id': [update_id] }, [
      {//delete this line $match: {"_id": ObjectId(update_id)},
        $set: {
        "data.velo": [[1, 2, 3], [5, 7]]
      }}
    ]);

As the official document has mentioned the parameters are: Query, UpdateData and Option. I made the mistake as my query was placed in my UpdateData() param (the $match). It should have been a param by itself as a query (query uses same syntax as find()). Another note is that if I were to use a pipeline aggregate, it should have been { $match: {...}, $set: {...} } instead of { {$match: {...}}, {$set: {...}} }

  • Related