Ключ сброса Sails.js и Waterline ORM MongoDB

Какой метод используется для сброса ключа в MongoDB с помощью Waterline ORM?

Рассмотрим следующий документ:

{
    name : 'brian',
    age : 29
}

Получить пользователя не проблема:

var users = Users.findOne({ name : 'brian' }).exec(cb);

Я бы хотел, чтобы возраст просто ушел. Я пробовал следующее, чтобы сделать это:

user.age = undefined;
user.save();

user.age = null;
user.save();

delete user.age;
user.save();

Ни один из них не работает. #1 устанавливает значение null, #2 устанавливает значение null, #3 оставляет исходное значение.

Спасибо.


person brian    schedule 18.08.2014    source источник
comment
Я не думаю, что он поддерживается (поскольку Waterline является общим, а $unset зависит от адаптера). Есть ли какая-то особая причина, по которой вам это нужно, а не ноль?   -  person Xinzz    schedule 19.08.2014
comment
@ Xinzz, нет, я полагаю, что нет. Я предполагаю, что единственной причиной будет возможность чтения непосредственно в базе данных, чтобы показать только то, что установлено (нулевое или нет), и то, что просто не принадлежит этому месту.   -  person brian    schedule 19.08.2014


Ответы (3)


Waterline — это ORM, предназначенный для поддержки широкого спектра хранилищ данных, поэтому он не поддерживает методы, характерные только для MongoDB. Вы всегда можете получить доступ к базовому драйверу MongoDB, используя метод .native(). , затем делайте все, что хотите (доступные методы см. в документации драйвера узла MongoDB) :

User.native(function(err, collection) {

    collection.findAndModify(
        {name: 'brian'}, 
        {$unset: {age: true}}, 
        function (err, object) {
           // Continue...
        }
    );
})
person sgress454    schedule 26.08.2014

Сервер MongoDB версии 3.2.9. Версия парусов 0.12.6. Версия узла 0.12.4.

Policies.native(function(err, collection) {
   var ObjectID = require('mongodb').ObjectID;
   collection.update(
      {"_id": new ObjectID(req.param('id'))},
      {$unset: {defaultSchema: ""}},
      function (err, object) {
         if(err) return res.badRequest(err);
         res.ok({"message":"Ok"});
      }
   );
});
person 1nstinct    schedule 31.10.2016

Принятый в настоящее время ответ не работает с текущими версиями Sails и Mongo. В Sails 1.1.0 (sails-mongo 1.0.1) с mongo 4.0, где User — это имя модели Sails, чтобы сбросить поле email:

const ObjectId = require('mongodb').ObjectID
const mongo = User.getDatastore().manager
const userCollection = mongo.collection(User.tableName)

await userCollection.update(
  {_id: ObjectId(someUserIdString)},
  {$unset: {email: ""}},
)
person Pistos    schedule 11.07.2019