문제
그래서 그룹 멤버십을 추적하는 내장 된 문서가 있습니다. 각 임베디드 문서에는 다른 컬렉션, 시작 날짜 및 선택 과목 날짜를 만료하십시오.
현재 그룹의 멤버를 쿼리하고 싶습니다. "현재"는 시작 시간이 현재 시간보다 적고 만료 시간이 현재 시간 또는 널보다 크다는 것을 의미합니다.
이 조건부 쿼리는 나를 완전히 차단하고 있습니다. 두 개의 쿼리를 실행하고 결과를 병합하여 할 수 있지만 추악한 것처럼 보이며 한 번에 모든 결과에서로드가 필요합니다. 또는 먼 미래에 임의의 날짜로 만료 시간을 기본으로 할 수는 있지만, 그것은 심지어 잠재적으로 부서 지기도합니다. 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
인덱스를 사용할 수 없기 때문에 쿼리는 부분적으로 느리게됩니다. 이런 종류의 문제의 경우, 나는 자연스럽게 지금보다 지금보다 더 커질 "만료"필드에 대한 높은 가치를 저장하는 것이 더 낫다고 생각합니다. 미래에 수백만 년 동안 매우 높은 날짜를 저장하거나 별도의 유형을 사용하여 결코 표시 할 수 있습니다. 크로스 타입 정렬 순서는 정의됩니다 여기.
빈 동성애 또는 맥스 키 (언어를 지원하는 경우)는 모두 좋은 선택입니다.