Fre*_*ook 9 mongoose mongodb node.js
我已经浏览了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);
});
}
}
Run Code Online (Sandbox Code Playgroud)
以下是架构:
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]
});
Run Code Online (Sandbox Code Playgroud)
这个发现也行不通,这可能是第一个问题:
User.find({
'_id': req.user._id,
'userListings._id': req.user.userListings[i]._id
}, function(err, user) {
console.log(err ? err : user);
});
Run Code Online (Sandbox Code Playgroud)
返回:
{ stack: [Getter/Setter],
arguments: [ 'path', undefined ],
type: 'non_object_property_call',
message: [Getter/Setter] }
Run Code Online (Sandbox Code Playgroud)
这应该相当于这个mongo客户端调用:
db.users.find({'userListings._id': ObjectId("4e44850101fde3a3f3000002"), _id: ObjectId("4e4483912bb87f8ef2000212")})
Run Code Online (Sandbox Code Playgroud)
运行:
mongoose v1.8.1
mongoose-auth v0.0.11
node v0.4.10
Run Code Online (Sandbox Code Playgroud)
当你已经拥有这个用户时,你可以这样做:
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) {
// ...
});
Run Code Online (Sandbox Code Playgroud)
在这里找到:http://mongoosejs.com/docs/subdocs.html
查找子文档
每个文档都有一个_id.DocumentArrays有一个特殊的id方法,用于通过_id查找文档.
Run Code Online (Sandbox Code Playgroud)var doc = parent.children.id(id);
**警告**
正如@zach所指出的那样,你必须在实际文档的模式之前声明子文档的模式才能使用该id()方法.
| 归档时间: |
|
| 查看次数: |
9205 次 |
| 最近记录: |