2015-08-07 14 views
1

У меня есть что-то вроде:мангуст исключить поле в массиве

Schema Subdocument 
name: String 
data: Mixed 

Schema Stuff 
documents: [Subdocument] 

Теперь в моем API есть две конечные точки, одна для Subdocument, а другой для Stuff. Когда я хочу получить Subdocument, мне нужно указать поле data, но когда я хочу получить Stuff, я хочу показать имя этих вложенных документов, но я не хочу показывать поле данных, потому что оно довольно велико и оно не будет использоваться.

Итак, чтобы все было ясно, данные не являются частными. Это просто, что я не хочу, чтобы это было показано, когда я получаю его от Stuff

Я попробовал, выполнив:

Stuff.findById(id) 
    .populate("documents") 
    .populate("-documents.data") 

, но это не работает ... Я получаю Stuff с Subdocument, содержащий name и data. Я чувствую, что мне не хватает мангуста, когда я вызываю populate("-documents.data"), что documents - это массив, и я хочу исключить поле data для каждого элемента в этом массиве.

Редактировать: К сожалению, схема, которую я предоставил, не для моего дела. В моем случае это не было заложено, но ссылка, например, так:

Schema Subdocument 
name: String 
data: Mixed 

Schema Stuff 
documents: [{ 
    type: Schema.Types.ObjectId, 
    ref: 'Subdocument' 
}] 

ответ

2

Предполагая поддокументе не встраивается, и с использованием в качестве «реф», как вы говорите, заселить работает, но часть данных не входит:

Stuff.findById(id).populate({ "path" : "documents", "select" : "-data" }) 
+0

Отлично, это работает. Я пробовал это раньше, но я редактировал findById() и вызывал метод getAll() из API для его проверки, поэтому я не видел никакого результата. Спасибо огромное! – olivarra1

1

Ваших документы имеет «встроенную» схему, поэтому заселить не используется здесь, он используется только для «ссылки» схем где другие объекты находятся в другой коллекции.

К счастью, с "встроенной" есть простой способ с помощью проекции:

Stuff.findById(id,{ "documents.name": 1 },function(err,results) { 

}) 

С результатами как

{ "documents": [{ "name": "this" },{ "name": "that" }] } 

Или с .aggregate() и $map оператора:

Stuff.aggregate(
    [ 
     { "$match": { "_id": ObjectID(id) } }, 
     { "$project": { 
      "documents": { 
       "$map": { 
        "$input": "$documents", 
        "as": "el", 
        "in": "$$el.name" 
       } 
      } 
     }} 
    ],function(err,results) { 

    } 
) 

Это будет просто трансформироваться в массив «только» me "values", который отличается от последней формы.

{ "documents": ["this", "that"] } 

Обратите внимание, при использовании .aggregate() вам необходимо правильно бросить ObjectId как autocasting от типов мангуст схемы не работает в стадии агрегации трубопроводов.

+0

Я так сожалею о моем вопросе ... как говорит Hiren, это не встроенный, я просто скопировал неправильно. Это ссылка ... Это одна из тех ситуаций, в которых я не знаю, кому дать ответ .... – olivarra1

+0

@ olivarra1 Давайте расскажем об этом, чтобы узнать, как представить свой вопрос. Синтаксис, который вы изначально использовали, «подразумевает» встроенную схему, так как вы определяете ее в коде. В следующий раз, когда вы зададите вопрос, скопируйте в соответствующие части вашего кода. Например, ваше фактическое определение схемы. Также отмечая, что вы даже не добавляли эту информацию, пока не приняли другой ответ. –