使用SailsJS更新MongoDb中的对象数组

时间:2015-08-04 12:01:57

标签: mongodb sails.js waterline

我在MongoDB中有以下格式的记录:

  {
    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'
  }

我想更新is_read数组中的status。这是我尝试过的。

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

但同样的查询在mongodb shell中运行得非常好。如果我错过了什么,有人可以指导我吗?顺便说一句,我在使用 Waterline ORM SailsJS 中运行此查询。

2 个答案:

答案 0 :(得分:3)

要使用与mongo shell相同的“相同”查询,您必须使用Model.native,因为Sails基于Waterline,它与Mongo的查询语言略有不同。

我没有试过这个,但我打赌这应该这样做:

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

答案 1 :(得分:0)

所以这就是我解决这个问题的方法。

     // 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);

          });

      });