2014-07-18 3 views
2

array._id! = 'someid'와 같은 쿼리를 어떻게 수행하는지 궁금합니다.

다음은 내가이 작업을 수행해야하는 이유의 예입니다. 사용자가 자신의 계정 이메일 주소를 업데이트하려고합니다. 그들이 로그인 할 때이 이름을 사용하면 고유해야합니다. 계정을 업데이트 할 때 새 이메일이 다른 계정에 존재하지 않는지 확인해야하지만 계정에 이미있는 이메일은 변경하지 않았으며 프로필의 다른 내용은 변경되지 않았습니다.).

다음은 사용 해본 코드입니다. 오류는 발생하지 않지만 항상 0을 반환하므로 오류가 발생하지 않도록합니다.

Schemas.Client.count({ _id: client._id, 'customers.email': email, 'customers._id': { $ne: customerID } }, function (err, count) { 
    if (err) { return next(err); } 
    if (count) { 
    // it exists 
    } 
}); 

$ ne 또는 $ not를 사용해야한다고 생각하지만 ObjectId를 사용하여이 온라인에 대한 예제를 찾을 수 없습니다.

예 클라이언트 데이터 :

{ 
    _id: ObjectId, 
    customers: [{ 
    _id: ObjectId, 
    email: String 
    }] 
} 

답변

1

, 그래서 한 문서와 일치하지 않을 것이다 email과 관계없이 customerID이 있으며 요소가 있습니다. 두 부분을 한 번에 각 요소에 대해 협력하여 작동 할 수 있도록하지만,이 동작을 변경할 $elemMatch를 사용할 수 있습니다

Schemas.Client.count({ 
    _id: client._id, 
    customers: { $elemMatch: { email: email, _id: { $ne: customerID } } } 
}, function (err, count) { 
    if (err) { return next(err); } 
    if (count) { 
    // it exists 
    } 
}); 
+0

이 내가 생각 해낸 것보다 훨씬 청소기, 나는 대답으로이 표시됩니다. 감사! – codephobia

0

나는이 사용하는 집계를 할 수 있었다.

왜 이런 식으로 작동하지 않았습니까? $ ne : customerID를 찾을 때 _id가 실제로 존재하기 때문에 결코 결과를 반환하지 않습니다. cutomers.email과 customers._id를 결합 할 수 없습니다. 여기

는 모습입니다 : 조회의 customers.emailcustomers._id 부품 그룹으로 customers의 모든 요소를 ​​통해 평가, 기존 쿼리와

Schemas.Client.aggregate([ 
    { $match: { _id: client._id } }, 
    { $unwind: '$customers' }, 
    { $match: { 
     'customers._id': { $ne: customerID }, 
     'customers.email': req.body.email 
    }}, 
    { $group: { 
     _id: '$_id', 
     customers: { $push: '$customers' } 
    }} 
    ], function (err, results) { 
     if (err) { return next(err); } 
     if (results.length && results[0].customers && results[0].customers.length) { 
     // exists 
     } 
    }); 
); 
관련 문제