2016-09-15 2 views
0

Я пытаюсь получить все документы в коллекции на основе значений массива поддокумента. Это моя структура данных в коллекции Я ищу:выборка документов на основе значения вложенного массива subdoc

{ 
    _id: ObjectId('...'), 
    name: "my event", 
    members: 
    [ 
     { 
      _id: ObjectId('...'), 
      name: "family", 
      users: [ObjectId('...'),ObjectId('...'),ObjectId('...')] 
     }, 
     { 
      _id: ObjectId('...'), 
      name: "work", 
      users: [ObjectId('...'),ObjectId('...'),ObjectId('...')] 
     } 
    ] 
} 

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

События:

{ 
    name: { type: String }, 
    members: {type: [{ type: ObjectId, ref: 'MemberGroup' }], default:[] } 
} 

MemberGroup:

{ 
    name: { type: String }, 
    users: [{type: mongoose.Schema.Types.ObjectId, ref: 'User'}] 
} 

и, конечно же, Пользователь - это просто произвольный объект с идентификатором.

Что я пытаюсь извлечь: Я хочу получить все события, у которых есть определенный идентификатор пользователя в поле member.users.

я не уверен, если его событие можно в одном вызове, но вот то, что я пробовал:

var userId = new mongoose.Schema.ObjectId('57d9503ef10d5ffc08d6b8cc'); 
events.find({members: { $elemMatch : { users: { $in: [userId]} } }}) 

этот синтаксис работает, но не возвращают элементы, даже если я знаю, что есть соответствующие элементы (используя robomongo визуализировать дб)

+0

Синтаксис является неправильный - 4 левых фигурных и 5 правых фигурных (также отсутствуют правые закрывающие скобки). Я исправил синтаксис, и он работает: 'db.events.find ({members: {$ elemMatch: {users: {$ in: [userId]}}}})' – TomG

+0

@ Нет, это была только копия вставки –

+0

Я понимаю, но, как я уже сказал, когда я запускаю этот запрос, он работает. поэтому я думаю, вы забываете что-то еще ... – TomG

ответ

0

Таким образом, после долгих поисков в StackOverflow я наткнулся на хорошую answare здесь:

MongoDB: How to find out if an array field contains an element?

моего запрос изменился к следующему, который дал мне мой желаемый результат:

var userId = new mongoose.Schema.ObjectId('57d9503ef10d5ffc08d6b8cc'); 
events.find({}, {members: { $elemMatch : { users: { $eq: userId} } }}) 

уведомления использования второго параметра найти, чтобы указать предел запроса вместо первого (что странно)