MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào để triển khai thao tác cập nhật &truy vấn mongodb này (trình điều khiển CSharp)?

Về cơ bản, nếu tôi hiểu được ý chính của bạn thì về cơ bản bạn muốn

  1. Kéo mục không bắt buộc khỏi mảng tham chiếu của bạn
  2. Đặt giá trị của trường tham chiếu chính của bạn thành phần tử đầu tiên của mảng đã thay đổi

Và thực hiện tất cả trong một lần cập nhật mà không cần di chuyển tài liệu qua đường dây.

Nhưng đáng buồn là điều này không thể được thực hiện. Vấn đề chính với điều này là không có cách nào để tham chiếu đến giá trị của trường khác trong tài liệu đang được cập nhật. Mặc dù vậy, để thực hiện việc này mà không cần lặp lại, bạn cũng cần phải truy cập vào đã thay đổi mảng để nhận phần tử đầu tiên mới.

Có lẽ một cách tiếp cận là suy nghĩ lại lược đồ của bạn để đạt được những gì bạn muốn. Tùy chọn của tôi ở đây sẽ mở rộng một chút trên các tài liệu tham khảo của bạn và loại bỏ nhu cầu về trường tham chiếu chính.

Có vẻ như giả định bạn sẵn sàng sống với các bản cập nhật là nếu tham chiếu bị loại bỏ là tham chiếu chính thì bạn chỉ có thể đặt tham chiếu chính mới thành phần tử đầu tiên trong mảng. Với ý nghĩ đó, hãy xem xét cấu trúc sau:

refs: [ { oid: "object1" }, { oid: "object2" }, { oid: "object5", main: true } ]

Bằng cách thay đổi những tài liệu này thành tài liệu có oid thuộc tính sẽ được đặt thành ObjectId, nó cung cấp tùy chọn để có một thuộc tính bổ sung trên tài liệu chỉ định thuộc tính nào là mặc định. Điều này có thể dễ dàng được truy vấn xác định Id nào là tham chiếu chính.

Bây giờ cũng hãy xem xét điều gì sẽ xảy ra nếu tài liệu khớp với "object5" trong trường oid được lấy từ mảng:

refs: [ { oid: "object1" }, { oid: "object2" } ]

Vì vậy, khi bạn truy vấn main-reference theo logic trước đó, bạn chấp nhận tài liệu đầu tiên trong mảng. Tất nhiên bây giờ, theo yêu cầu ứng dụng của bạn, nếu bạn muốn đặt một main-reference khác bạn chỉ cần thay đổi tài liệu

refs: [ { oid: "object1" }, { oid: "object2", main: true } ]

Và bây giờ logic vẫn là chọn phần tử mảng có thuộc tính chính là true sẽ xảy ra theo sở thích, và như được hiển thị ở trên rằng nếu thuộc tính đó không tồn tại trên bất kỳ tài liệu phần tử nào thì chuyển trở lại phần tử đầu tiên.

Với tất cả những thứ đó đã được tiêu hóa, thao tác của bạn để kéo tất cả các tham chiếu đến một đối tượng ra khỏi mảng đó trong tất cả các tài liệu trở nên khá đơn giản, như được thực hiện trong shell (về cơ bản sẽ áp dụng cùng một định dạng cho bất kỳ trình điều khiển nào):

db.books.update(
   { "refs.oid": "object5" },
   { $pull: { refs: {oid: "object5"} } }, false, true )

Hai đối số bổ sung cho truy vấn và thao tác cập nhật là upsertmulti tương ứng. Trong trường hợp này, upsert không có nhiều ý nghĩa vì chúng tôi chỉ muốn sửa đổi các tài liệu tồn tại và multi có nghĩa là chúng tôi muốn cập nhật mọi thứ phù hợp. Mặc định là chỉ thay đổi tài liệu đầu tiên.

Đương nhiên, tôi đã rút ngắn tất cả các ký hiệu nhưng tất nhiên các giá trị có thể là ObjectId thực tế theo ý định của bạn. Cũng có vẻ hợp lý khi cho rằng cách sử dụng chính của bạn đối với main-reference là khi bạn đã lấy tài liệu. Xác định truy vấn trả về main-reference bằng cách tuân theo logic đã được vạch ra nên có thể thực hiện được, nhưng vẫn có thể xảy ra, tôi đã gõ rất nhiều thứ ở đây và cần giải lao cho bữa tối :)

Tôi nghĩ rằng đây là một trường hợp đáng giá để suy nghĩ lại giản đồ của bạn để tránh lặp lại quá nhiều lần cho những gì bạn muốn đạt được.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cập nhật và trả lại tài liệu trong Mongodb

  2. Tìm nạp dữ liệu từ 2 bộ sưu tập trong mongodb trong một truy vấn

  3. Làm cách nào để trích xuất dữ liệu NumberLong từ Mongodb bằng Node.js?

  4. Cảnh báo khởi động Mongodb sau khi cập nhật

  5. Toán tử `$ eq` có hoạt động với ký hiệu chấm mảng không?