Cập nhật đối tượng lồng nhau MongoDB

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
    collection
        .updateMany(and(
            eq("id", "p00"),
            in("children._id", [c00, c01])), 
        combine(
            set("children.$.value", false)
    ));
    
    1 trong danh sách
    collection
        .updateMany(and(
            eq("id", "p00"),
            in("children._id", [c00, c01])), 
        combine(
            set("children.$.value", false)
    ));
    
    2
    sau đó hợp nhất thành viên
    collection
        .updateMany(and(
            eq("id", "p00"),
            in("children._id", [c00, c01])), 
        combine(
            set("children.$.value", false)
    ));
    
    0 với
    collection
        .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)
    khác thì đừng thay đổi
    collection
        .updateMany(and(
            eq("id", "p00"),
            in("children._id", [c00, c01])), 
        combine(
            set("children.$.value", false)
    ));
    
    0
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

Cập nhật đối tượng lồng nhau MongoDB

Giải pháp

public courseCategoryPostCommentReplyUpdate(operation: CommentReplyUpdateMutation): Promise<IDocumentUpdateType> {
    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<IDocumentUpdateType> {
    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<IComment> {
    return this.courseCategoryPostCommentsModel.findOne<IComment>({
      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 đó

Làm cách nào để cập nhật mảng đối tượng lồng nhau trong MongoDB?

Cập nhật mảng đối tượng lồng nhau .
db. thu thập. .
Toán tử $set thay thế giá trị của một trường bằng giá trị đã chỉ định
The filtered positional operator $[] identifies the array elements that match the arrayFilters conditions for an update operation..

Làm cách nào để cập nhật mảng tài liệu con trong MongoDB?

sử dụng từ khóa $set
chỉ định trường động trong $set bằng cú pháp []. truy vấn = { "vị trí. các đơn vị. mã đơn vị". "PHG_KTN2" }; . { ["địa điểm. $. các đơn vị. "+ tìm thấyUnitIdx]. đơn vị Mục } }; . cập nhật ( truy vấn, updateItem, { upsert. ĐÚNG VẬY } );

Làm cách nào để cập nhật đối tượng lồng nhau trong Java?

Để cập nhật thực thể lồng nhau, bạn cần phải gửi yêu cầu PUT tới thực thể mẹ cao nhất . Chẳng hạn, thông tin Nhà tuyển dụng được lồng trong Khách hàng. Điều này có nghĩa là để cập nhật thông tin Nhà tuyển dụng, bạn sẽ gửi yêu cầu PUT đến thực thể của Khách hàng.

Làm cách nào để cập nhật mảng đối tượng trong MongoDB bằng nút js?

Để cập nhật phần tử mảng đầu tiên của mỗi tài liệu phù hợp với truy vấn của bạn, hãy sử dụng toán tử vị trí $ . Toán tử vị trí $ tham chiếu mảng phù hợp với truy vấn. Bạn không thể sử dụng toán tử này để tham chiếu một mảng lồng nhau.