2011-08-12 3 views
8

저는 몽구스 API와 SO 및 Google 그룹에 대한 많은 질문을 검토 한 결과 임베디드 문서를 업데이트 할 수 없습니다.몽구스에 포함 된 문서를 업데이트하는 방법은 무엇입니까?

이 특정 userListings 객체를 args의 내용으로 업데이트하려고합니다. 여기

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] } 

이것은 th와 동일해야합니다. 몽고 클라이언트 호출은 다음과 같습니다

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

:

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

답변

6

, 당신은 같은 것을 할 수 있습니다

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

Finding a sub-document

Each document has an _id. DocumentArrays have a special id method for looking up a document by its _id.

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

* * 경고 * *

로 @jach가 지적한 바에 따르면 실제 문서의 스키마 앞에 서브 문서의 스키마를 선언해야를 사용할 수 있습니다방법.

+2

나는 형식 오류 "를 얻고 것은 이것이

' " – FrederickCook

+0

몽구스 인증 문제입니까? 그것이 req.user가 할당 된 곳입니다. – FrederickCook

+0

mongoose docu는 다음과 같이 말합니다. "DocumentArrays에는 임베디드 문서를 _id 속성으로 필터링하는 특수 메서드 ID가 있습니다 (각각의 포함 된 문서는 하나를 가져옵니다)". 하지만 나 자신이 이것을 시도하지 않았습니다. – pkyeck

0

변수 이름에 대한이 단지 불일치인가?

루프에는 user.userListings[i].listingId이지만 에는 user.userListings[i]._id이 있습니다.

listingId 또는 _id을 찾으십니까? 이미 사용자가있을 때

0

부모 개체를 저장하고 중첩 된 문서를 markModified해야합니다. 객체 [개체 개체], [개체 개체], [개체 개체], [개체 개체]있는 방법이 없습니다 '를 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); 
    }); 
    }); 
}; 
관련 문제