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

MongoDB $ indexOfArray

Trong MongoDB, $indexOfArray toán tử đường ống tổng hợp tìm kiếm một mảng cho sự xuất hiện của một giá trị được chỉ định và trả về chỉ số mảng của lần xuất hiện đầu tiên.

Cú pháp

Cú pháp như sau:

{ $indexOfArray: [ <array expression>, <search expression>, <start>, <end> ] }

Ở đâu:

  • <array expression> là mảng để tìm kiếm.
  • <search expression> là giá trị bạn muốn tìm trong mảng.
  • <start> là một đối số tùy chọn chỉ định một điểm bắt đầu để tìm kiếm trong mảng. Có thể là bất kỳ biểu thức hợp lệ nào phân giải thành một số nguyên không âm.
  • <end> là một đối số tùy chọn chỉ định vị trí chỉ mục kết thúc cho tìm kiếm. Có thể là bất kỳ biểu thức hợp lệ nào phân giải thành một số nguyên không âm.

Trong MongoDB, mảng dựa trên 0, do đó, số lượng chỉ mục bắt đầu từ 0 (0 ).

Nếu không tìm thấy giá trị đã chỉ định, hãy $indexOfArray trả về -1 .

Nếu có nhiều trường hợp của giá trị được chỉ định, thì chỉ bản đầu tiên được trả về.

Ví dụ

Giả sử chúng ta có một bộ sưu tập được gọi là products với các tài liệu sau:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "XS", "M", "L" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "XS", "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XXS", "XS", "M", "XL" ] }
{ "_id" : 4, "prod" : "Zap", "sizes" : [ 10, 12, 15 ] }
{ "_id" : 5, "prod" : "Tap", "sizes" : [ 15, 16, 20 ] }

Dưới đây là một ví dụ về việc áp dụng $indexOfArray đối với các tài liệu đó:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

Trong hai tài liệu đầu tiên, giá trị tìm kiếm được tìm thấy ở vị trí 0 (mảng dựa trên 0).

Trong tài liệu thứ ba, nó được tìm thấy ở vị trí 1 . Lưu ý rằng việc tìm kiếm là một kết quả phù hợp chính xác. Nó không trả về vị trí 0 , ngay cả khi giá trị ở vị trí 0 chứa giá trị tìm kiếm (tức là XXS chứa XS ).

Giá trị tìm kiếm không được tìm thấy trong hai tài liệu cuối cùng và vì vậy -1 đã được trả lại.

Đây là một ví dụ khác, ngoại trừ lần này chúng tôi tìm kiếm giá trị số:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15 ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : 0 }

Chỉ định vị trí bắt đầu

Bạn có thể cung cấp đối số thứ ba để chỉ định vị trí chỉ mục bắt đầu cho tìm kiếm.

Ví dụ:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15, 1 ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

Trong trường hợp này, biểu thức tìm kiếm không được tìm thấy trong tài liệu thứ hai (tài liệu 5). Điều này là do chúng tôi đã bắt đầu tìm kiếm ở vị trí 1 và mặc dù tài liệu đó có chứa biểu thức tìm kiếm, nhưng nó lại ở vị trí 0 (trước vị trí bắt đầu tìm kiếm).

Chỉ định vị trí kết thúc

Bạn cũng có thể cung cấp đối số thứ tư để chỉ định vị trí chỉ mục kết thúc cho tìm kiếm.

Nếu bạn cung cấp đối số này, bạn cũng cần cung cấp vị trí bắt đầu. Không làm như vậy sẽ dẫn đến đối số này được hiểu là điểm khởi đầu.

Ví dụ:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 1 ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }

Tài liệu thứ ba trả về -1 có nghĩa là không tìm thấy biểu thức tìm kiếm.

Đây là những gì sẽ xảy ra nếu chúng tôi tăng vị trí chỉ mục kết thúc lên 1:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 2 ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }

Lần này giá trị đã được bao gồm và vị trí chỉ mục của nó được trả lại.

Mảng trống

Tìm kiếm một mảng trống trả về -1 .

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : [ ], "result" : -1 }

Các trường bị thiếu

Nếu trường không có trong tài liệu, $indexOfArray trả về null .

Giả sử chúng ta có tài liệu sau:

{ "_id" : 8, "prod" : "Map" }

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $indexOfArray :

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Kết quả:

{ "result" : null }

Giá trị rỗng

Nếu biểu thức mảng là null (thay vì một mảng), $indexOfArray trả về null .

Giả sử chúng ta có tài liệu sau:

{ "_id" : 7, "prod" : "Lap", "sizes" : null }

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $indexOfArray :

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : null, "result" : null }

Tuy nhiên, khi biểu thức tìm kiếm null , kết quả là -1 , trừ khi biểu thức mảng cũng là null hoặc trường của nó bị thiếu:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5, 6, 7, 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", null ] }
          }
     }
   ]
)

Kết quả:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }
{ "sizes" : [ ], "result" : -1 }
{ "sizes" : null, "result" : null }
{ "result" : null }

Loại dữ liệu sai

Nếu biểu thức mảng là kiểu dữ liệu sai, $indexOfArray trả về một lỗi.

Giả sử chúng ta có tài liệu sau:

{ "_id" : 9, "prod" : "Box", "sizes" : "XXL" }

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $indexOfArray vào tài liệu đó:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 9 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XXL" ] }
          }
     }
   ]
)

Kết quả:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfArray requires an array as a first argument, found: string",
	"code" : 40090,
	"codeName" : "Location40090"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Như thông báo lỗi nêu rõ, $indexOfArray requires an array as a first argument .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Không tìm thấy thư mục dữ liệu / data / db

  2. Định dạng một số dưới dạng tiền tệ trong SQL

  3. Làm cách nào để bảo vệ trường mật khẩu trong Mongoose / MongoDB để nó không trả về trong một truy vấn khi tôi điền các bộ sưu tập?

  4. tar gzip mongo dump như MySQL

  5. Lấy HTML từ MongoDB để sử dụng trong Mẫu