2017-01-16 1 views
0

Я пытаюсь создать список наблюдений, где пользователи могут смотреть элементы. Я пытался создать его, добавив в список пользователей поле наблюдения. Список наблюдения будет представлять собой массив идентификаторов, соответствующих другим элементам.Как проверить, существует ли каждый элемент в массиве или нет

Пользователи Коллекция:

  • ID: ObjectId
  • Имя: строка
  • Список наблюдения: массив т.е. [9872, 342, 4545, 234, 8745]

У меня есть вопрос связано с запросом этой структуры. Я хочу, чтобы иметь возможность написать запрос, в котором я передаю идентификатор пользователя и массив из ~ 20 идентификаторов и проверить, какие из этих идентификаторов пользователь наблюдает (т. Е. Какой из них существует в поле наблюдения для этого пользователя).

Я попробовал это первоначально:

db.users.find({ 
    _id: 507c35dd8fada716c89d0013, 
    watchlist: { $in: [342, 999, 8745, etc...] } 
}); 

Но это дает мне список пользователей, которые содержат какие-либо из этих элементов WatchList, которые не то, что я хочу. То, что я на самом деле хочу, это ответ, содержащий массив так:

{ 
    id: 342, 
    exists: true 
}, 
{ 
    id: 999, 
    exists: false 
}, 
{ 
    id: 8745, 
    exists: true 
} 

Я бы даже быть хорошо просто получить массив элементов, которые соответствуют:

{ 
    _id: 507c35dd8fada716c89d0013, 
    watching: [342, 8745] 
} 

Является ли это выполнимо, или я был бы лучше перемещать список наблюдения в отдельную коллекцию с пользователями в виде массива? (Моя забота о последнем подходе заключается в том, что пользователь будет наблюдать только несколько сотен элементов, но десятки тысяч пользователей могут смотреть один и тот же элемент.)

+0

Попробуйте изменить его. Попробуйте сохранить список идентификаторов пользователей в каждом списке наблюдения и списке наблюдения за существованием данного пользователя. –

ответ

0

Вы можете легко достичь второго выхода с помощью оператора $ setIntersection.

db.users.aggregate(
    [ {$match:{"_id": 507c35dd8fada716c89d0013}}, 
    { $project: { "watching": { $setIntersection: [ "$watchlist", [ 342, 999, 8745 ] ] } } } 
    ] 
) 

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

  • Нет связанных вопросов^_^