Как обновить встроенный документ в мангусте? - PullRequest
9 голосов
/ 12 августа 2011

Я просмотрел API mongoose и много вопросов о SO и о группе Google, но до сих пор не могу понять, как обновить встроенные документы.

Я пытаюсь обновить этот конкретный объект userListings.с содержанием аргументов.

for (var i = 0; i < req.user.userListings.length; i++) {
    if (req.user.userListings[i].listingId == req.params.listingId) {
        User.update({
            _id: req.user._id,
            'userListings._id': req.user.userListings[i]._id
        }, {
            'userListings.isRead': args.isRead,
            'userListings.isFavorite': args.isFavorite,
            'userListings.isArchived': args.isArchived
        }, function(err, user) {
            res.send(user);
        });
    }
}

Вот схемы:

var userListingSchema = new mongoose.Schema({
    listingId: ObjectId,
    isRead: {
        type: Boolean,
        default: true
    },
    isFavorite: {
        type: Boolean,
        default: false
    },
    isArchived: {
        type: Boolean,
        default: false
    }
});

var userSchema = new mongoose.Schema({
    userListings: [userListingSchema]
});

Эта находка также не работает, что, вероятно, является первой проблемой:

User.find({
    '_id': req.user._id,
    'userListings._id': req.user.userListings[i]._id
}, function(err, user) {
    console.log(err ? err : user);
});

, который возвращает:

{ stack: [Getter/Setter],
  arguments: [ 'path', undefined ],
  type: 'non_object_property_call',
  message: [Getter/Setter] }

Это должно быть эквивалентно этому вызову клиента монго:

db.users.find({'userListings._id': ObjectId("4e44850101fde3a3f3000002"), _id: ObjectId("4e4483912bb87f8ef2000212")})

Запуск:

mongoose v1.8.1
mongoose-auth v0.0.11
node v0.4.10 

Ответы [ 3 ]

7 голосов
/ 12 августа 2011

когда у вас уже есть пользователь, вы можете просто сделать что-то вроде этого:

var listing = req.user.userListings.id(req.params.listingId);

listing.isRead = args.isRead;
listing.isFavorite = args.isFavorite;
listing.isArchived = args.isArchived;

req.user.save(function (err) {
  // ...
});

, как показано здесь: http://mongoosejs.com/docs/subdocs.html

Поиск подспискадокумент

Каждый документ имеет _id.DocumentArrays имеет специальный метод id для поиска документа по его _id.

var doc = parent.children.id(id);

* * warning * *

, как указал @zach,Вы должны объявить схему поддокумента перед фактической схемой документа, чтобы иметь возможность использовать метод id().

0 голосов
/ 17 апреля 2015

Необходимо сохранить родительский объект и пометить модифицированный вложенный документ.

Вот как мы это делаем

exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  Profile.findById(req.params.id, function (err, profile) {
    if (err) { return handleError(res, err); }
    if(!profile) { return res.send(404); }
    var updated = _.merge(profile, req.body);
    updated.markModified('NestedObj');
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, profile);
    });
  });
};
0 голосов
/ 12 августа 2011

Это просто несоответствие имен переменных?

У вас есть user.userListings[i].listingId в цикле for, но user.userListings[i]._id в find.

Вы ищете listingId или _id?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...