>백엔드 개발 >PHP 튜토리얼 >MongoDB 파이프라인 운영자

MongoDB 파이프라인 운영자

小云云
小云云원래의
2017-12-06 14:09:182265검색

리눅스 운영체제에 익숙한 친구들은 리눅스에도 데이터를 편리하게 처리할 수 있는 파이프라인이 있다는 걸 알아야 합니다. MongoDB 버전 2.2에는 새로운 데이터 집계 프레임워크도 도입되었습니다. 문서는 여러 노드로 구성된 파이프라인을 통과할 수 있습니다. 각 노드에는 문서 그룹화, 문서 필터링 등과 같은 고유한 특수 기능이 있습니다. 각 노드는 일련의 문서를 허용합니다. , 이러한 문서에 대한 일부 유형 변환을 수행한 후 변환된 문서를 다음 노드로 전달하면 마지막 노드가 결과를 클라이언트에 반환합니다. 이 기사에서는 먼저 몇 가지 기본 파이프라인 연산자를 살펴보겠습니다.

$match

$match를 사용하여 문서를 필터링할 수 있으며, 필터링을 통해 얻은 문서의 하위 집합에 대해 데이터 집계 작업을 수행할 수 있습니다. 예를 들어 컬렉션에서 작성자가 "Du Fu"인 모든 문서를 다음과 같이 가져옵니다.

db.sang_collect.aggregate({$match:{author:"杜甫"}})

실제 사용에서는 $match를 파이프라인 앞에 두는 것이 가장 좋습니다. 후속 파이프라인의 워크로드를 방지하는 동시에 프로젝션 및 그룹화 전에 $match를 실행할 때 인덱스를 사용할 수도 있습니다.

$project

기본 사용법

$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固定集合详解

node.js操作MongoDB的代码案例分享

phpstudy如何扩展MongoDB

위 내용은 MongoDB 파이프라인 운영자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.