当前位置:  开发笔记 > 编程语言 > 正文

如何在mongoose中更新嵌入式文件?

如何解决《如何在mongoose中更新嵌入式文件?》经验,为你挑选了1个好方法。

我已经浏览了mongoose API,以及关于SO和google组的许多问题,但仍无法弄清楚更新嵌入式文档.

我正在尝试使用args的内容更新此特定的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] }

这应该相当于这个mongo客户端调用:

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

运行:

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

pkyeck.. 8

当你已经拥有这个用户时,你可以这样做:

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

**警告**

正如@zach所指出的那样,你必须在实际文档的模式之前声明子文档的模式才能使用该id()方法.



1> pkyeck..:

当你已经拥有这个用户时,你可以这样做:

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

**警告**

正如@zach所指出的那样,你必须在实际文档的模式之前声明子文档的模式才能使用该id()方法.


我得到"TypeError:Object [object Object],[object Object],[object Object],[object Object]没有方法'id'"
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有