2014-08-27 4 views
0

두 개의 컬렉션 pagelikes이 있습니다. 두 컬렉션 모두 필드가 pageId입니다. likes에도 필드 userName이 있습니다.MongoDB에서 NOT EXISTS 쿼리를 실행하는 방법은 무엇입니까?

likes 모음에 pageId/userName 쌍이 있으면 해당 페이지가 특정 사용자와 유사하다는 의미입니다.

특정 사용자가 좋아하지 않은 페이지를 반환하는 쿼리는 어떻게 실행합니까?

SELECT * 
FROM page 
WHERE NOT EXISTS (SELECT 'a' FROM likes WHERE (likes.pageId = page.pageId) AND (likes.userName = 'userName')) 
LIMIT 1 

는 내가 그 의미가 같은 이름을 가진 SQL 작업 다르다는 것을 읽은 $exists 운영자하지만 here를 사용하는 방법에 대한 생각 나는 사용해야합니다 :

SQL에서이 같을 것이다 $in 연산자.

내가 할 수

  1. 특정 사용자가 좋아하는 모든 페이지를 찾아 및 목록에 저장하고
  2. 다음 포함되지 않은 firt 페이지를 반환해야하는 page에 쿼리를 실행 목록에.

나는 매우 비효율적 인 것처럼 보이기 때문에이 방법을 구현하는 것을 주저하고 있습니다. (2 단계에서는 하나의 페이지 만 필요하지만 사용자의 좋아하는 모든 것을 탐색해야합니다.)

+1

데이터 예제를 포함 할 수 있습니까? (하나의 레코드로 충분할 것입니다.) 존재하지 않는 것을 확인하기 위해 $ 존재를 사용하는 것은 꽤 쉽지만, 여러분의 데이터가 어떻게 설정되는지는 모두 이해할 수 있습니다. –

답변

1

그래서 초기 질문을 잘못 읽었지만 대답하기 위해 MongoDB를 사용하여 단일 쿼리에서이 쿼리를 수행 할 방법이 없습니다.

일반적으로 데이터를 설정할 때 데이터 (사용자, 좋아하는 사람 및 페이지의 별도 모음)와 같이 데이터를 표준화하지 않으려합니다.

그래서 첫 번째 단계는 우리가 찾고있는 사용자를 기반으로 고유 한 좋아하는 목록을 얻는 것입니다.

db.likes.find({personId: <your_id>}, function(e, allLikes) {/* more */}) 

좋아요를 얻은 후에는 고유 한 페이지 ID 목록을 얻는 것이 좋습니다. _.uniq()을 사용하거나 온라인에서 찾을 수있는 다른 방법을 사용할 수 있습니다.

고유 한 페이지 배열 _id을 얻으면 이제 $nin을 사용하여 쿼리를 수행 할 수 있습니다.

db.pages.find({_id: { $nin: uniquePageIds } }, function(e, allUnlikedPages) { /* your logic */ }) 

$nin는 배열을하고 배열에없는 값을 갖는 것도 일치합니다. You can read here for more details.

+0

감사합니다. 이러한 종류의 쿼리는 내 시스템에서 가장 자주 수행되는 작업 중 하나입니다. 이 경우 데이터를 구조화하는 올바른 방법은 무엇입니까? 나는 지금 막이 일을하기 시작 했으므로 내가 원하는대로 그것을 디자인 할 수있다. –

+0

@DmitriPisarenko 일반적으로 관련 데이터를 함께 포함하고자합니다. 예제에서 우리는'user','likes' (like like 별도의 레코드),'pages'를 가지고 있습니다.이상적인 세상에서, 좋아하는 것들은 배열로서 사용자 정보에 포함되거나, 또는'likes' 콜렉션은 모든 사용자의 좋아하는 것에 대해 하나의 레코드를 보유 할 것입니다. –

+0

@DmitriPisarenko 여러분이 좋아하는 것을'user' 데이터 안에 저장하고 있다면, [MongoDB 내의 BSON limits] (http://docs.mongodb.org/manual/reference/limits/) (한 레코드 당 16MB 크기 제한). –

관련 문제