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

MongoDB $ trong Nhà điều hành đường ống tổng hợp

Trong MongoDB, $in toán tử đường ống tổng hợp trả về một boolean cho biết liệu một giá trị được chỉ định có trong mảng hay không.

$in không nên nhầm lẫn toán tử đường ống tổng hợp với $in toán tử truy vấn, chọn các tài liệu trong đó giá trị của một trường bằng bất kỳ giá trị nào trong mảng được chỉ định.

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" : [ "S", "M", "XL", "XXL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

Chúng tôi có thể sử dụng $in toán tử để tìm hiểu xem có hay không các kích thước sizes trường chứa giá trị L .

Ví dụ:

db.products.aggregate(
   [
     {
       $project:
          {
            hasLarge: { $in: [ "L", "$sizes" ] }
          }
     }
   ]
)

Kết quả:

{ "_id" : 1, "hasLarge" : false }
{ "_id" : 2, "hasLarge" : true }
{ "_id" : 3, "hasLarge" : true }

Đối số thứ hai phải phân giải thành một mảng

Đối số thứ hai của $in toán tử phải phân giải thành một mảng. Nếu không, lỗi sẽ được trả lại.

Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập:

{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" }

Lưu ý rằng các kích thước sizes trường không phải là một mảng - nó là một chuỗi.

Hãy áp dụng $in vào tài liệu đó:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ "L", "$sizes" ] }
          }
     }
   ]
)

Kết quả:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$in requires an array as a second argument, found: string",
	"code" : 40081,
	"codeName" : "Location40081"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Trong trường hợp này, các sizes trường chứa một chuỗi., và do đó một lỗi được trả về.

Trong ví dụ này, tôi cũng sử dụng $in với $match để lọc tài liệu chỉ để lọc những tài liệu mà tôi quan tâm. Lưu ý rằng điều này sử dụng $in cú pháp toán tử truy vấn, chấp nhận một đối số duy nhất và không được nhầm lẫn với cú pháp hai đối số.

Giá trị rỗng

Điều tương tự sẽ xảy ra nếu đối số thứ hai là null .

Hãy thêm tài liệu sau vào bộ sưu tập:

{ "_id" : 5, "prod" : "Jeans", "sizes" : null }

Đây là những gì sẽ xảy ra nếu chúng tôi cố gắng sử dụng $in với tài liệu đó:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ "L", "$sizes" ] }
          }
     }
   ]
)

Kết quả:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$in requires an array as a second argument, found: null",
	"code" : 40081,
	"codeName" : "Location40081"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Cùng một lỗi.

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

Nó cũng tương tự với các trường bị thiếu.

Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:

{ "_id" : 6, "prod" : "Shorts" }

Và bây giờ chúng tôi cố gắng áp dụng $in với kích thước sizes lĩnh vực:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ "L", "$sizes" ] }
          }
     }
   ]
)

Kết quả:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$in requires an array as a second argument, found: missing",
	"code" : 40081,
	"codeName" : "Location40081"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Biểu thức chính quy

Không giống như $in toán tử truy vấn, $in nhà điều hành đường ống tổng hợp không hỗ trợ việc sử dụng các biểu thức chính quy.

Do đó, mã sau không dẫn đến kết quả khớp:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ /^X/, "$sizes" ] }
          }
     }
   ]
)

Kết quả:

{ "_id" : 1, "hasLarge" : false }
{ "_id" : 2, "hasLarge" : false }
{ "_id" : 3, "hasLarge" : false }

Kết quả cho tất cả các tài liệu là false , mặc dù các sizes trường trong cả ba tài liệu không chứa các phần tử mảng bắt đầu bằng chữ hoa X .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Điền mảng lồng nhau trong mongoose

  2. Cập nhật tài liệu con chứa trong một mảng có trong tài liệu MongoDB

  3. Làm cách nào để tắt thông báo nhật ký MongoDB trong bảng điều khiển?

  4. Tại sao mongoose sử dụng lược đồ khi lợi ích của mongodb được cho là nó không có lược đồ?

  5. Kiểm tra sự tồn tại của Bộ sưu tập trong MongoDB