Mình có tài liệu dạng này
{ "id": "5a212b985735dd44089e4782", "people": [ { "personId": "5a212b985735dd44089e4783", "name": "Ronaldo", "parents": [ { "parentId": "5a212b985735dd44089e4784", "name": "Messi", "address": [ { "addressId": "5a212b985735dd44089e4785", "country": "Argentina", "city": "Blah Blah" }, { "addressId": "5a212b985735dd44089e4786", "country": "USA", "city": "New York" } ] } ] } ] }
Tôi phải thay thế đối tượng cha đang thoát bên trong mảng cha bằng một đối tượng cha mới
Mã tôi đã viết là
Query query = new Query[Criteria.where["id"].is["5a212b985735dd44089e4782"]]; Update update = new Update[].push["people.$.parents", parent]; this.mongoTemplate.findAndModify[query, update, PeopleInfo.class];
Tuy nhiên, thay vì thay thế đối tượng gốc hiện có, nó đang tạo một đối tượng mới
Có ai biết làm thế nào để thực hiện một truy vấn loại này?
- stackoverflow. com
điểm. 0
Hãy đọc tài liệu về push
tại đây. Điều bạn nên làm trong trường hợp này là set
chứ không phải push
Query query = new Query[Criteria.where["id"].is["5a212b985735dd44089e4782"]];
Update update = new Update[].set["people.parents", parent];
this.mongoTemplate.findAndModify[query, update, PeopleInfo.class];
Thêm câu hỏi với thẻ tương tự
Đây là nỗ lực của tôi, tuy nhiên rõ ràng nó đang cập nhật chỉ thực hiện 1 lần cập nhật cho bản ghi gốc, nghĩa là chỉ có ____________ sẽ được sửa đổi với giá trị sai
collection
.updateMany[and[
eq["id", "p00"],
in["children._id", [c00, c01]]],
combine[
set["children.$.value", false]
]];
Điều này có khả thi không hay tôi cần di chuyển bọn trẻ lên để tạo ra một cấu trúc phẳng hơn?
Thanks
- stackoverflow. comđiểm. 1
câu trả lời được chấp nhận
Bạn có thể làm điều đó với cập nhật đường ống
Cập nhật đường ống cho phép chúng tôi sử dụng tất cả các toán tử tổng hợp, vì vậy chúng tôi có thể thực hiện các cập nhật phức tạp [trong trường hợp của bạn, có thể điều đó cũng có thể xảy ra với các toán tử cập nhật, nhưng với đường ống thì thật dễ dàng]
Yêu cầu cập nhật đường ống >= MongoDB 4. 2
Mã kiểm tra tại đây
Truy vấn
- trận đấu vào ngày
id=p00
- ánh xạ từng thành viên [_______3_______0 biến] của mảng con
nếu
1 trong danh sáchcollection .updateMany[and[ eq["id", "p00"], in["children._id", [c00, c01]]], combine[ set["children.$.value", false] ]];
2collection .updateMany[and[ eq["id", "p00"], in["children._id", [c00, c01]]], combine[ set["children.$.value", false] ]];
sau đó hợp nhất thành viên
0 vớicollection .updateMany[and[ eq["id", "p00"], in["children._id", [c00, c01]]], combine[ set["children.$.value", false] ]];
4 [giống như thêm cặp giá trị khóa]collection .updateMany[and[ eq["id", "p00"], in["children._id", [c00, c01]]], combine[ set["children.$.value", false] ]];
khác thì đừng thay đổi
0collection .updateMany[and[ eq["id", "p00"], in["children._id", [c00, c01]]], combine[ set["children.$.value", false] ]];
db.collection.update[{
"id": {
"$eq": "p00"
}
},
[
{
"$set": {
"children": {
"$map": {
"input": "$children",
"as": "c",
"in": {
"$cond": [
{
"$in": [
"$$c.id",
[
"c00",
"c01"
]
]
},
{
"$mergeObjects": [
"$$c",
{
"value": false
}
]
},
"$$c"
]
}
}
}
}
}
]]
Nếu bạn không muốn sử dụng đường dẫn cập nhật [cập nhật của bạn rất đơn giản và nó cũng có thể được thực hiện với các bộ lọc mảng] và trong Java sẽ giống như dưới đây
Để cập nhật một đối tượng bên trong một mảng lồng nhau trong MongoDB, bạn có thể sử dụng phương pháp này, Nó đã được thử nghiệm và hoạt động tốt
Trường hợp
Cập nhật các đối tượng mảng lồng nhau. Xem hình dưới đây để biết rõ hơn về những gì chúng ta sẽ làm. Chúng tôi sẽ cập nhật đối tượng được lồng bởi 3 cấp độ của mảng
{
discussionList[
discussionList [
{
object-value-to-be-updated.
}
]
]
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Giải pháp
public courseCategoryPostCommentReplyUpdate[operation: CommentReplyUpdateMutation]: Promise {
return this.courseCategoryPostCommentsModel.updateOne[
{
"postId" : operation.postId,
'discussionList': {
'$elemMatch': {
'_id': operation.commentId,
"discussionList._id": operation.replyId
}
}
},
{
$set: {
"discussionList.$[outer].discussionList.$[inner].payload": operation.payload,
"discussionList.$[outer].discussionList.$[inner].isUpdated": true,
"discussionList.$[outer].discussionList.$[inner].commentUpdateTime": new Date[]
}
},
{
arrayFilters: [
{ "outer._id": operation.commentId},
{"inner._id": operation.replyId}
]
}
];
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
FootNotes - mã này là để cập nhật câu trả lời của một bình luận
Đó là cách bạn có thể thực hiện các thao tác trên một đối tượng trong mảng lồng nhau trong tài liệu mongoDB. Bạn cũng có thể cập nhật/xóa các đối tượng có mức độ lồng ghép cao hơn bằng cách sửa đổi truy vấn
Ví dụ về xóa và nhận
Xóa bỏ// Informational Note:
// Delete nested array values in mongodb
public courseCategoryPostCommentReplyDelete[operation: CommentReplyDeleteMutation]: Promise {
return this.courseCategoryPostCommentsModel.updateOne[
{
'postId': operation.postId,
'discussionList': {
'$elemMatch': {
'_id': operation.commentId,
'discussionList._id': operation.replyId
}
}
}, {
$pull: {
'discussionList.$[outer].discussionList': {
user: operation.userId,
_id: operation.replyId
}
}
},
{
arrayFilters: [
{ 'outer._id': operation.commentId }
],
multi: false
}
];
}
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
ĐƯỢC
public courseCategoryPostCommentRead[postId: string]: Promise {
return this.courseCategoryPostCommentsModel.findOne[{
postId: postId
}].populate['discussionList.user'].populate['discussionList.discussionList.user'].exec[];
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Tôi đang sử dụng GraphQL. Bạn có thể cần lặp lại kết quả và hiển thị nhận xét/câu trả lời theo đó