2015-10-14 2 views
1

Вот моя попытка запроса ответ AFTER Серджиу Zaharie был размещен ниже:Фильтрация .find() на основе другого документа возвращает []

db.collection('users').find({_id:ObjectID('561f0cbd3ed5b852e95cab6a')}).limit(1).toArray(function(error, result) { 
     if((!error) && (result[0] !== undefined) && result.length) { 
      var user = result[0]; 

      console.log("User ID: ", user._id); 
      console.log("Blocked users: ", user.blocked_users); 
      console.log("passed quizzes: ", user.passed_quizzes); 
      console.log("failed quizzes: ", user.failed_quizzes); 

      db.collection('users').find({ 
       $and: [ 
        { _id: { $in: [user._id] } }, 
        { blocked_users: { $nin: [user.blocked_users] } }, 
        { passed_quizzes: { $nin: [user.passed_quizzes] } }, 
        { failed_quizzes: { $nin: [user.failed_quizzes] } } 
       ] 
      }).toArray(function(error, doc) { 
       console.log("Results: ", doc); 
      }); 
     } 
    }); 

Там три пользователей в таблице, одна с ObjectID('561f0cbd3ed5b852e95cab6a') (мне), один с ObjectID('561f0bbaff803840e917568d') (майкл) и один с ObjectID('561f0b68d83c293fe960a25d') (thomas).

Выполненный запрос должен был вернуть учетную запись с ObjectID('561f0bbaff803840e917568d') (Michael), а запрос возвратил [] 0 результатов.

Вывод данных:

User ID: 561f0cbd3ed5b852e95cab6a 
Block users: [ 561f0b68d83c293fe960a25d ] 
passed quizzes: [] 
failed quizzes: [] 
Results: [] 

Это сделает запрос выполняется следующим образом:

db.collection.find({ 
    $and: [ 
     // Void out myself, because I'm looking for other people. 
     { _id: { $nin: [ ObjectID('561f0cbd3ed5b852e95cab6a') ] } }, 
     // Void out blocked users, because I blocked them. 
     { blocked_users: { $nin: [ObjectID('561f0b68d83c293fe960a25d')] } }, 
     // More array based filtering: (Blank arrays, shouldn't matter right now) 

     { passed_quizzes: { $nin: [] } }, 
     { failed_quizzes: { $nin: [] } } 
    ] 
}); 

Как уже говорилось, это оставляет место для документа с ObjectID('561f0bbaff803840e917568d') возвращенной заявление находкой(). Поскольку он не фильтруется в соответствии с указанными выше требованиями.

+0

После @ ответ Серджиу, я переписали вопрос более программирования ориентированный вопрос. – Hobbyist

+0

Вы не должны переписывать свой вопрос, но вместо этого задайте новый вопрос - теперь ответ @Sergui не имеет смысла ..... – Soren

ответ

2

Попробуйте этот запрос:

db.collection.find(
    { [ 
     {_id: { $nin: [id] }}, 
     { "settings.min_rating": { $lt: rating }}, 
     { "settings.max_rating": { $gt: rating }}, 
     { blockedUsers: { $nin: [id] }}, 
     { discoveredUsers: { $nin: [id] }} 
     ] 
    } 
) 
+2

Предполагается, что '$ и' вам даже не нужно. –

+0

Я добавил TON информации на свой вопрос, пытаясь сделать мой запрос работать с вашим примером, однако возникли проблемы с запросом, всегда возвращающим '[]' – Hobbyist

+0

Исправьте свой ответ, чтобы иметь '{_id: {$ nin: [id ]}} 'и я соглашусь. – Hobbyist

Смежные вопросы