문제

그래서 그룹 멤버십을 추적하는 내장 된 문서가 있습니다. 각 임베디드 문서에는 다른 컬렉션, 시작 날짜 및 선택 과목 날짜를 만료하십시오.

현재 그룹의 멤버를 쿼리하고 싶습니다. "현재"는 시작 시간이 현재 시간보다 적고 만료 시간이 현재 시간 또는 널보다 크다는 것을 의미합니다.

이 조건부 쿼리는 나를 완전히 차단하고 있습니다. 두 개의 쿼리를 실행하고 결과를 병합하여 할 수 있지만 추악한 것처럼 보이며 한 번에 모든 결과에서로드가 필요합니다. 또는 먼 미래에 임의의 날짜로 만료 시간을 기본으로 할 수는 있지만, 그것은 심지어 잠재적으로 부서 지기도합니다. SQL에서는 "(만료> = now ()) 또는 (만료는 null)"로 표현합니다. 그러나 몽고에서 어떻게 해야할지 모르겠습니다.

어떤 아이디어? 미리 감사드립니다.

도움이 되었습니까?

해결책

앞으로이 페이지에서 누군가가 우연히 발견 될 것이라고 생각했다고 생각했습니다. 1.5.3 기준으로 Mongo는 이제 Real $ 또는 운영자를 지원합니다. http://www.mongodb.org/display/docs/advanced+queries#advancedqueries-%24or

"(만료> = now ()) 또는 (만료는 null)에 대한 귀하의 쿼리" ""

{$or: [{expires: {$gte: new Date()}}, {expires: null}]}

다른 팁

누구나 유용하다고 생각하는 경우 www.querymongo.com 조항을 포함하여 SQL과 MongoDB 간의 번역을 수행합니다. SQL 동등한 것을 알고있을 때 구문을 파악하는 데 정말 도움이 될 수 있습니다.

또는 진술의 경우, 그것은 다음과 같이 보입니다.

SQL :

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';

mongodb :

db.collection.find({
    "$or": [{
        "columnA": 3
    }, {
        "columnB": "string"
    }]
});

기본적으로 몽고의 쿼리 객체와 함께 표현식. Mongo에는 현재 이러한 쿼리에 대한 OR 연산자가 포함되어 있지 않지만 이러한 쿼리를 표현하는 방법이 있습니다.

"in"또는 "where"를 사용하십시오.

그것은 다음과 같은 것입니다 :

db.mycollection.find( { $where : function() { 
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );

db.lead.find (

{"name": {'$regex' : '.*' + "Ravi" + '.*'}},
{
"$or": [{
    'added_by':"arunkrishna@aarux.com"
}, {
    'added_by':"aruna@aarux.com"
}]
}

);

사용 a $where 인덱스를 사용할 수 없기 때문에 쿼리는 부분적으로 느리게됩니다. 이런 종류의 문제의 경우, 나는 자연스럽게 지금보다 지금보다 더 커질 "만료"필드에 대한 높은 가치를 저장하는 것이 더 낫다고 생각합니다. 미래에 수백만 년 동안 매우 높은 날짜를 저장하거나 별도의 유형을 사용하여 결코 표시 할 수 있습니다. 크로스 타입 정렬 순서는 정의됩니다 여기.

빈 동성애 또는 맥스 키 (언어를 지원하는 경우)는 모두 좋은 선택입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top