2014-02-14 1 views
1

저는 Sail.js와 Waterline ORM을 사용하여 간단한 애플리케이션을 만들고 있습니다. 이 부분에 대해서는 NoSQL의 피벗 테이블 패턴과 같습니다. 각 사용자의 구독 채널은 모두 subscriptions입니다.

User.find({subscriptions: {$in: [req.param('channel')]}}).done(function (err, users) { 
    /* ... */ 
}); 

코드의 가장 아름다운 라인이 모든 기록되지하지만 해야 일 : 나는 다음과 같은 사용하여 특정 채널 ID에 가입 한 모든 사용자를 찾을 시도하고있다. 문제는 그렇지 않다는 것입니다. users은 빈 배열이고 err은 null입니다. 그들은 (노드 관리자를 사용하여), 예를 들면, 실행 실제 조회 :

이 같은 쿼리가 umongo의 GUI를 통해 사용자를 "발견"하는 데 사용됩니다
{ subscriptions: { '$in': [ '52fd1a033004de2d9bcb4980' ] } } 

, 그것은 제대로 작동합니다. 그러나 함수가 실행될 때 사용자를 찾을 수 없습니다.

아이디어가 있습니까? 감사!

답변

0

어레이 내부에서 무언가를 찾으려면 $를 사용하지 않아도됩니다. 간단한 찾기가 트릭을 수행합니다.

db.users.find({subscriptions : '52fd1a033004de2d9bcb4980'}) 

해당 채널을 사용하는 모든 사용자가 반환됩니다.

+0

아, 감사합니다! 그래도 Mongo에 조금 익숙한 사람이라면 누구나 알면 초기 코드가 작동하지 않는 이유가 궁금 할 것입니다. –

+0

$에서 제공하는 배열에 레코드가 있어야합니다. 레코드 배열에 값을 제공 할 필요가 없습니다. – Guilro

+0

예를 들어, 이름이 john, peter 또는 paul 인 모든 사용자에게 db.users.find ({firstName : {$ in : [ 'john', 'peter', 'paul']}})를 원하게됩니다. 그것은 당신이 그것을 어떻게 사용하고 있었는지에 대해 다른 방향입니다. – joao

2

참고로 유효한 대답은 유효한 Mongo 쿼리이지만 올바른 Sails 코드는 아닙니다. 당신이 원하는 :

User.find({subscriptions: req.param('channel')}).done(function (err, users) { 
    /* ... */ 
}); 

작동하지 않았다 원래 코드가 항해 ORM (워터)가 $in 같은 기본 몽고 연산자를 이해하지 않는다는 것입니다 이유. 그러나 기본 Mongo 어댑터를 사용하여 find 작업을 수행하므로 단일 채널을 검색하면 subscriptions 배열에 해당 채널을 포함하는 모든 레코드가 일치합니다. 낮은 레벨의 Mongo 연산자 (예 : $all)를 사용해야하는 경우 모델 클래스의 native 메서드를 사용하여 기본 Mongo 어댑터에 액세스 할 수 있습니다. 자세한 내용은 this answer을 참조하십시오.