리눅스 운영체제에 익숙한 친구들은 리눅스에도 데이터를 편리하게 처리할 수 있는 파이프라인이 있다는 걸 알아야 합니다. MongoDB 버전 2.2에는 새로운 데이터 집계 프레임워크도 도입되었습니다. 문서는 여러 노드로 구성된 파이프라인을 통과할 수 있습니다. 각 노드에는 문서 그룹화, 문서 필터링 등과 같은 고유한 특수 기능이 있습니다. 각 노드는 일련의 문서를 허용합니다. , 이러한 문서에 대한 일부 유형 변환을 수행한 후 변환된 문서를 다음 노드로 전달하면 마지막 노드가 결과를 클라이언트에 반환합니다. 이 기사에서는 먼저 몇 가지 기본 파이프라인 연산자를 살펴보겠습니다.
$match
$match를 사용하여 문서를 필터링할 수 있으며, 필터링을 통해 얻은 문서의 하위 집합에 대해 데이터 집계 작업을 수행할 수 있습니다. 예를 들어 컬렉션에서 작성자가 "Du Fu"인 모든 문서를 다음과 같이 가져옵니다.
db.sang_collect.aggregate({$match:{author:"杜甫"}})
실제 사용에서는 $match를 파이프라인 앞에 두는 것이 가장 좋습니다. 후속 파이프라인의 워크로드를 방지하는 동시에 프로젝션 및 그룹화 전에 $match를 실행할 때 인덱스를 사용할 수도 있습니다.
$project는 다음과 같이 원하는 필드를 추출하는 데 사용할 수 있습니다.
db.sang_collect.aggregate({$project:{title:1,_id:0}})
1은 이 필드를 원한다는 의미이고, 0은 이 필드를 원하지 않음을 의미하며 반환된 필드의 이름을 바꿀 수도 있습니다. 예를 들어, 제목은 다음과 같이 articleTitle로 변경됩니다.
db.sang_collect.aggregate({$project:{"articleTitle":"$title"}})
다만, 원본 필드에 인덱스가 있으면 이름이 변경된 필드에는 인덱스가 없으므로 주의해야 할 문제가 있습니다. 이름을 바꾸기 전에 색인을 사용하는 것이 가장 좋습니다.
수학 표현식을 사용하면 일련의 값을 더하고 빼고 곱하고 나누어 모듈로를 취할 수 있습니다. 예를 들어 내 데이터 구조는 다음과 같습니다.
{ "_id" : ObjectId("59f841f5b998d8acc7d08863"), "orderAddressL" : "ShenZhen", "prodMoney" : 45.0, "freight" : 13.0, "discounts" : 3.0, "orderDate" : ISODate("2017-10-31T09:27:17.342Z"), "prods" : [ "可乐", "奶茶" ] }
주문의 총 비용은 다음과 같습니다. 쿼리는 다음과 같습니다.
db.sang_collect.aggregate({$project:{totalMoney:{$add:["$prodMoney","$freight"]}}})
실제 결제 수수료는 총 수수료에서 할인을 뺀 금액입니다.
db.sang_collect.aggregate({$project:{totalPay:{$subtract:[{$add:["$prodMoney","$freight"]},"$discounts"]}}})
prodMoney와 화물 및 할인의 곱을 계산하는 등 의미 없는 세 가지 작업을 수행해 보겠습니다. :
db.sang_collect.aggregate({$project:{test1:{$multiply:["$prodMoney","$freight","$discounts"]}}})
또 다른 예는 다음과 같이 $prodMoney와 $freight의 몫을 찾는 것입니다.
db.sang_collect.aggregate({$project:{test1:{$pide:["$prodMoney","$freight"]}}})
또 다른 예는 $freight를 사용하여 다음과 같이 $prodMoney를 모듈로하는 것입니다.
db.sang_collect.aggregate({$project:{test1:{$mod:["$prodMoney","$freight"]}}})
덧셈과 곱셈 모두 여러 매개변수를 받을 수 있습니다. , 나머지는 모두 두 개의 매개변수를 받습니다.
날짜 표현식은 날짜 유형에서 다음과 같이 연, 월, 일, 주, 시, 분, 초 및 기타 정보를 추출할 수 있습니다.
db.sang_collect.aggregate({$project:{"年份":{$year:"$orderDate"},"月份":{$month:"$orderDate"},"一年中第几周":{$week:"$orderDate"},"日期":{$dayOfMonth:"$orderDate"},"星期":{$dayOfWeek:"$orderDate"},"一年中第几天":{$dayOfYear:"$orderDate"},"时":{$hour:"$orderDate"},"分":{$minute:"$orderDate"},"秒":{$second:"$orderDate"},"毫秒":{$millisecond:"$orderDate"},"自定义格式化时间":{$dateToString:{format:"%Y年%m月%d %H:%M:%S",date:"$orderDate"}}}})
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("59f841f5b998d8acc7d08861"), "年份" : 2017, "月份" : 10, "一年中第几周" : 44, "日期" : 31, "星期" : 3, "一年中第几天" : 304, "时" : 9, "分" : 27, "秒" : 17, "毫秒" : 342, "自定义格式化时间" : "2017年10月31 09:27:17" }
$dayOfWeek 반환 주입니다. 1은 일요일, 7은 토요일, $week는 이번 주가 올해의 주임을 의미하며 0부터 계산됩니다. $dateToString은 MongoDB3.0+의 기능입니다. 다음과 같은 형식 문자도 있습니다.
Character | Meaning | 값 범위 |
---|---|---|
%Y | 연도(4자리, 0 패딩) | 0000-9999 |
%m | 월(2자리, 제로 패딩) | 01-12 |
%d | 일(2자리, 제로 패딩) | 01-31 |
%H | 시 2자리 , 제로 패딩) | 00-60 |
%L | 밀리초(3자리, 제로 패딩) | 000-999 |
%j | 일(3자리, 제로 패딩) | 001 -366 |
%w | 요일(1-일요일, 7-토요일) | 1-7 |
%U | 연도의 주(2자리, 0 패딩) | 00- 53 |
字符串表达式字符串表达式中有字符串的截取、拼接、转大写、转小写等操作,比如我截取orderAddressL前两个字符返回,如下: db.sang_collect.aggregate({$project:{addr:{$substr:["$orderAddressL",0,2]}}}) 再比如我将orderAddressL和orderDate拼接后返回: db.sang_collect.aggregate({$project:{addr:{$concat:["$orderAddressL",{$dateToString:{format:"--%Y年%m月%d",date:"$orderDate"}}]}}}) 结果如下: { "_id" : ObjectId("59f841f5b998d8acc7d08861"), "addr" : "NanJing--2017年10月31" } 再比如我将orderAddressL全部转为小写返回: db.sang_collect.aggregate({$project:{addr:{$toLower:"$orderAddressL"}}}) 再比如我将orderAddressL全部转为大写返回: db.sang_collect.aggregate({$project:{addr:{$toUpper:"$orderAddressL"}}}) 逻辑表达式想要比较两个数字的大小,可以使用$cmp操作符,如下: db.sang_collect.aggregate({$project:{test:{$cmp:["$freight","$discounts"]}}}) 如果第一个参数大于第二个参数返回正数,第一个参数小于第二个则返回负数,也可以利用$strcasecmp来比较字符串(中文无效): db.sang_collect.aggregate({$project:{test:{$strcasecmp:[{$dateToString:{format:"..%Y年%m月%d",date:"$orderDate"}},"$orderAddressL"]}}}) 至于我们之前介绍的$eq/$ne/$gt/$gte/$lt/$lte等操作符在这里一样是适用的。另外还有$and、$or、$not等表达式可用,以$and为例,如下: db.sang_collect.aggregate({$project:{test:{$and:[{"$eq":["$freight","$prodMoney"]},{"$eq":["$freight","$discounts"]}]}}}) $and中的每个参数都为true时返回true,$or则表示参数中有一个为true就返回true,$not则会对它的参数的值取反,如下: db.sang_collect.aggregate({$project:{test:{$not:{"$eq":["$freight","$prodMoney"]}}}}) 另外还有两个流程控制语句,如下: db.sang_collect.aggregate({$project:{test:{$cond:[false,"trueExpr","falseExpr"]}}}) $cond第一个参数如果为true,则返回trueExpr,否则返回falseExpr. db.sang_collect.aggregate({$project:{test:{$ifNull:[null,"replacementExpr"]}}}) $ifNull第一个参数如果为null,则返回replacementExpr,否则就返回第一个参数。 以上内容就是MongoDB管道操作符部分介绍,希望能帮助到大家。 |
위 내용은 MongoDB 파이프라인 운영자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!