Updating an array of objects in MongoDb with SailsJS

I have a record in MongoDB in the following format:

  {
    attachment: 'xxxxxxx',
    createdAt: TueAug04201514: 52: 23GMT+0400(GST),
    text: 'xxxxxxx',
    sender: '55784247c95c59cc746904e1',
    status: [
      {
        user: '5589464675fc0892757d170e',
        is_read: 0
      },
      {
        user: '55a4a39d5c0bf23d21e6c485',
        is_read: 0
      },
      {
        user: '55a4a38e5c0bf23d21e6c483',
        is_read: 0
      },
      {
        is_read: 0,
        user: '55784247c95c59cc746904e1'
      }
    ],
    thread: '55c0946b80320adb3fd04d0e',
    updatedAt: TueAug04201515: 45: 55GMT+0400(GST),
    id: '55c09967708b73184558fbc8'
  }

      

I would like to update is_read

inside the array status

. Here's what I've tried.

      Messages.update({
          thread: threadIds,
          status: { $elemMatch: { user: user.id, is_read: 0 } }
        },
        { $set: { "status.$.is_read": 1 } })

      

But the same query works very well in mongodb shell. Can anyone guide me if I am missing something? By the way, I am running this query in SailsJS which uses the Waterline ORM .

+3


source to share


2 answers


So here's how I solved it.



     // You have to use {model_name}.mongo.objectId() for ids otherwise your
     // query will not work.
     threadIds.push(Messages.mongo.objectId(thread.id));

     Messages.native(function (err, collection ) {

        if (err) {
          return res.send(500, err);
        }

        collection.update({
            thread: {$in: threadIds},
            status: {
              $elemMatch: {
                user: user.id,
                is_read: 0
              }
            }
          },
          {
            $set: {"status.$.is_read": 1}
          }, function (err, messages) {

            if (err) {
              return res.send(500, err);
            }

            return res.send(200);

          });

      });

      

0


source


To use the "same" query as the mongo wrapper you will need to use Model.native

as Sails is based on Waterline, which has a slightly different query language from Mongo.

I haven't tried this, but I would say it should do it:



  Messages.update({
      thread: threadIds,
      'status.user': user.id,
      'status.is_read': 0 
  },
  { 'status.is_read': 1 }, callback);

      

+3


source







All Articles