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 оставляет исходное значение.

Благодарю.

2 ответа

Решение

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

User.native(function(err, collection) {

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

В настоящее время принятый ответ не работает с текущими версиями Sails и Mongo. В паруса 1.1.0 (sails-mongo 1.0.1), с монго 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: ""}},
)

Сервер 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"});
      }
   );
});
Другие вопросы по тегам