2016-11-25 2 views
0

У меня есть коллекция «задач», доступная для всех пользователей. Пользователи могут отметить, что они «выполнили задачу». Когда они это делают, вызывается метод, который добавляет их userId к массиву, который прикреплен к документу задачи с именем «usersCompleted». Если пользователь выполнил задачу, их userId будет в этом массиве.Как вернуть один индекс из массива в публикации Meteor

Я не хочу публиковать этот массив для клиента, потому что тогда у всех пользователей будет доступ к массиву с другими userIds.

Однако я хочу иметь помощника, который проверяет, находится ли идентификатор пользователя в этом массиве, а затем возвращает либо «проверено», либо «». Таким образом пользователи видят задачи, которые они выполнили.

В моей публикации я могу найти все задачи, которые пользователь выполнил, но я не могу вернуть только их идентификатор из массива «usersCompleted». Если кто-нибудь может помочь мне сделать это, это будет очень признательно.

Ниже мой текущий код, но $ elemMatch не используется правильно

Meteor.publish('tasks.single.lesson.completed', function(lessonNumber) { 
    check(lessonNumber, Number); 

    if(this.userId) { 
    return Tasks.find({ lesson: lessonNumber, usersCompleted: this.userId} , {fields: { $elemMatch: {usersCompleted: this.userId}}}); 
    } else { 
    this.stop(); 
    return; 
    } 
}); 
+0

Возможный дубликат [Получить только запрашиваемый элемент в массив объектов в коллекции MongoDB] (http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection) – felix

ответ

1

Я работал на это, и я отправляю ответ для всех, кто может иметь этот вопрос.

Оказывается Монго имеет модификатор, построенный для этой ситуации: $

Моя рабочая публикация сейчас:

Meteor.publish('tasks.single.lesson.completed', function(lessonNumber) { 
    check(lessonNumber, Number); 
    if(this.userId) { 
    return Tasks.find({ lesson: lessonNumber, usersCompleted: this.userId} , 
         { fields: { "usersCompleted.$": 1}}); 
    } else { 
    this.stop(); 
    return; 
    } 
});