2015-04-16 2 views
1

У меня возникли проблемы с запросом БД, я хочу, чтобы все элементы, что есть, например: админ «54bd13864ec56c7c12310a79» в массиве Админ,MongoDB: найти один ObjectId в массиве

пытался его " $ в "но это не сработало, может ли это быть связано с тем, что его ObjectId?

trainerId = '54bd13864ec56c7c12310a79' 
GroupSchema.find({'admins': { $in: [ trainerId ] }} 

Это мой дб:

{ 
    "_id" : ObjectId("54b93e8e3801ae381e3433be"), 
    "groupName" : "Developers Groups", 
    "createdBy" : "Ido", 
    "creationDate" : "Jan 16 2015", 
    "users" : [ 
     ObjectId("54b932c7ac3ec34a85e6246c") 
    ], 
    "admins" : [ 
     ObjectId("54b932c7ac3ec34a85e6246c"), 
     ObjectId("54bd13864ec56c7c12310a79") 
    ], 
    "__v" : 0 
} 

модель схемы является:

module.exports = mongoose.model('Groups' , 
{ 
    groupName: String, 
    createdBy: String, 
    creationDate: String, 
    admins: [{ type : mongoose.Schema.Types.ObjectId, ref: 'Users' }], 
    users: [{ type : mongoose.Schema.Types.ObjectId, ref: 'Users' }] 
} 
); 

ответ

1

Преобразовать строку идентификатора ObjectId:

var mongoose = require('mongoose'), 
    trainerId = '54bd13864ec56c7c12310a79'; 
var id = mongoose.Types.ObjectId(trainerId); 

GroupSchema.find({'admins': id }); 
+1

Ну вы получили мое в пути к решению: Это было: вар trainerId = мангуст .Schema.Types.ObjectId (trainerId); GroupSchema.find ({'admins': {$ in: [trainerId]}} Я отметил ваш ответ в корне, спасибо :) –

+1

Это сработало спасибо :) –

+0

@Jumpy_Goat Не стоит беспокоиться :-) – chridam

1

Если я правильно понимаю ваш вопрос, вы, вероятно, хотите использовать $elemMatch для этого. $ in следует использовать, когда вы хотите проверить, равно ли поле без массива одно из значений, указанных в массиве, который вы передаете в $ in.

+0

Как я могу использовать $ elemMatch в случае ObjectId? Я пробовал: db.groups.find ('admins': {$ elemMatch: {'54b932c7ac3ec34a85e6246c'}}), но это тоже не сработало –

+0

try '{$ elemMatch: {$ eq: '54b932c7ac3ec34a85e6246c'}}' – Prusse

+0

не сработало .... –

1

Если я правильно понимаю ваш вопрос, вы, вероятно, можете попробовать $unwind в агрегации, отделить элемент от админов.

4

Это ObjectId:

ObjectId ("54bd13864ec56c7c12310a79")

и это строка:

trainerId = '54bd13864ec56c7c12310a79'

Так может быть, вы должны использовать ObjectId в своем qu чень.

+0

Ops слишком рано ... Didnt работы я получаю 0 строк .... –

1

Похоже, что вы хотите, чтобы соответствовать родительскому документу с поддокументом идентификатором. Вы можете использовать простой запрос:

GroupSchema.find({'admins._id': trainerId}})

Или вы могли бы использовать $elemMatch, но, как говорит доктор, это не нужно: Если указать только одно условие в выражении $ elemMatch, вам не нужно использовать $ elemMatch.

GroupSchema.find({admins: {$elemMatch: {_id: trainerId}}})

Что касается литья строкового значения к ObjectId, мангуст автоматически сделает это за вас внутри.

+0

Я не получаю исключение в обоих из них, но я получаю 0 результатов. Я дважды проверяю Id ... это правильно. оба: ".find ({'admins': {$ elemMatch: {'_id': '54b932c7ac3ec34a85e6256c'}}})" и ".find ({'admins._id': '54b932c7ac3ec34a85e6256c'}})" didn " t работал –

+0

Что такое 'GroupSchema'? Конвенция использует имя внутренней модели в качестве имени объекта модели: 'Group'. Тем не менее, очень странно, что вам нужно передать строковое значение ObjectId, если вы используете mongoose. Можете ли вы опубликовать какую версию мангуста вы используете и что такое 'GroupSchema'? –

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