2016-09-21 3 views
0

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

var mySubEntitySchema = new Schema({ 
    property1: String, 
    property2: String 
}); 

var myEntitySchema = new Schema({ 
    name: String, 
    sub: [mySubEntitySchema] 
}); 

export var MyEntityModel: mongoose.Model<MyEntityDocument> = mongoose.model<MyEntityDocument>("MyEntity", myEntitySchema); 

Теперь я хочу, чтобы получить конкретный MyEntityDocument, для которого я имею _id, но только в поддокументах соответствия property1 = "пример".

Есть ли способ сделать это?

Я попытался решение с использованием Aggregate, но без какого-либо успеха:

MyEntityModel.aggregate([ 
{$match: { "_id": myId, "sub.property1":"example" }}, 
     {$unwind: "$sub"}, 
     {$match: { "sub.property1":"example"}}, 
     {$group: {"_id":"$_id","subs":{$push:"$sub"}}} 
    ], (error, result) => { 
     console.log("Result = " + JSON.stringify(result)); 
     } 
    }); 

Но это ничего не возвращает. Если я не ставил «_id»: myId в первом предложении $ match, то я получаю результаты, но мне нужен только один результат, который соответствует _id, который у меня есть.

Кто-нибудь знает, как я могу это сделать?

EDIT: Как уже было сказано, вот пример.

С помощью этих данных:

{ 
    "_id": "54c12276fcb2488d300795e4", 
    "name": "a", 
    "sub": [ 
     { 
     "_id": "54c12276fcb2488d300795e0", 
     "property1": "example", 
     "property2": "something" 
     }, 
     { 
     "_id": "54c12276fcb2488d300795e1", 
     "property1": "notmuch", 
     "property2": "somethingelse" 
     }, 
     { 
     "_id": "54c12276fcb2488d300795e2", 
     "property1": "notinteresting", 
     "property2": "something" 
     }, 
     { 
     "_id": "54c12276fcb2488d300795e3", 
     "property1": "example", 
     "property2": "anotherthing" 
     } 
    ] 
    }, 
    { 
    "_id": "54c12277fcb2488d300795e5", 
    "name": "b", 
    "sub": [ 
     { 
     "_id": "54c12276fcb2488d300795e6", 
     "property1": "example", 
     "property2": "word" 
     } 
    ] 
    } 

Я хочу, чтобы объект с _id "54c12276fcb2488d300795e4" и subdocs, которые соответствуют property1 = "пример". Таким образом, ожидаемый результат:

{ 
    "_id": "54c12276fcb2488d300795e4", 
    "name": "a", 
    "sub": [ 
     { 
     "_id": "54c12276fcb2488d300795e0", 
     "property1": "example", 
     "property2": "something" 
     }, 
     { 
     "_id": "54c12276fcb2488d300795e3", 
     "property1": "example", 
     "property2": "anotherthing" 
     } 
    ] 
    } 
+0

Можете ли вы добавить образец данных и результат, который вы хотите здесь? –

+0

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

ответ

0

Вы можете использовать findOne, чтобы получить то, что вы хотите.

MyEntityModel.findOne({_id : myId , "sub.property1" :"example"},{'sub.$' : 1},function(err,result){ 
    if(!err) 
    { 
     if(result) 
     { 
      //result is the document you were searching for 
     } 
    } 
}); 

{ 'к югу от $': 1} будет возвращать только совпадающий элемент.

Пройти через mongoose query documentation для лучшего понимания.

0

Ваш запрос, кажется, работает нормально и, как ожидается, получит результат, за исключением того, что синтаксис агрегатной функции является ненадлежащим. См. Ссылку this о том, как агрегированные запросы записываются с использованием мангуста. Вы не должны передавать массив, как в mongodb console. Просто передайте запросы, разделенные запятыми, как показано в следующем запросе.

MyEntityModel.aggregate(
    {$match: { "_id": myId, "sub.property1":"example" }}, 
    {$unwind: "$sub"}, 
    {$match: { "sub.property1":"example"}}, 
    {$group: {"_id":"$_id","name": {"$first": "$name"}, "subs":{$push:"$sub"}}} 
, (error, result) => { 
    console.log("Result = " + JSON.stringify(result)); 
    } 
}); 
+0

Все еще не работает для меня, я понятия не имею, почему. Если я не ставил совпадение на _id, это просто отлично работает, но как только я добавляю этот критерий, результат пуст. Ну, в моем реальном коде я точно не совпадаю на _id, но на другом объекте, не знаю, изменилось ли это? –

+0

вы можете поделиться значением 'myId' перед его передачей агрегированной функции, в' console.log' –

+0

Я упростил свой код, чтобы было легче понять, поэтому у меня действительно нет значения myId. Но в любом случае мои критерии хороши, потому что все происходит так: FindOne с «_id»: myId возвращает результат. Агрегат без «_id»: myId возвращает все документы с поддокументами, соответствующими sub.property1: «example» (и только эти вложенные документы) Как только я добавляю «_id»: myId в агрегат, я вдруг не получаю результат. –

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