Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何更新mongoose中的嵌入文档?_Mongodb_Node.js_Mongoose - Fatal编程技术网

Mongodb 如何更新mongoose中的嵌入文档?

Mongodb 如何更新mongoose中的嵌入文档?,mongodb,node.js,mongoose,Mongodb,Node.js,Mongoose,我已经浏览了MongooseAPI,以及关于SO和google group的许多问题,但仍然不知道如何更新嵌入式文档 我试图用args的内容更新这个特定的userListings对象 for (var i = 0; i < req.user.userListings.length; i++) { if (req.user.userListings[i].listingId == req.params.listingId) { User.update({

我已经浏览了MongooseAPI,以及关于SO和google group的许多问题,但仍然不知道如何更新嵌入式文档

我试图用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);
        });
    }
}
这个发现也不起作用,这可能是第一个问题:

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 

这只是变量名称不匹配吗

您在
for
循环中有
user.userListings[i].listingId
,但在
find
中有
user.userListings[i].\u id


您正在查找
listingId
\u id

当您已经拥有用户时,您可以执行以下操作:

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) {
  // ...
});
如图所示:

查找子文档

每个文档都有一个_id。DocumentArray有一个特殊的id方法,用于通过文档的_id查找文档

var doc = parent.children.id(id);
**警告**


正如@zach指出的,为了能够使用
id()
方法,您必须在实际文档的模式之前声明子文档的模式。

您必须保存父对象,并修改嵌套文档

我们就是这样做的

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

我得到了“类型错误:对象[Object Object],[Object Object],[Object Object],[Object Object]没有方法'id'”这是mongoose身份验证问题吗?mongoose docu说:“DocumentArrays有一个特殊的方法id,它通过它们的_id属性过滤嵌入的文档(每个嵌入的文档都有一个)”。但我自己没试过。我和弗雷德里克库克有同样的问题。有关于为什么会发生这种情况的答案吗?我查了一下文件Ray和id都没有定义,我也在努力解决这个问题。事实证明,定义模式的顺序很重要。如果子文档不是第一个,那么该.id最终将是未定义的。详情如下:
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);
    });
  });
};