2016-11-20 13 views
0

Я хочу найти встраиваемый документ в mongodb и возвращать только то, что я ищу. Вот документ:Вложенные запросы вложенных запросов Minimongo

"_id" : "yH8HmCPz6H6E8Hinq", 
"between" : [ 
    "4bgdLrztpqgwAkZP4", 
    "9jZhXHjAkoY7mmX7B" 
], 
"messages" : [ 
    { 
     "content" : "fdsqf", 
     "user" : "4bgdLrztpqgwAkZP4", 
     "created_at" : ISODate("2016-11-17T23:13:59.659Z"), 
     "isSeen" : false, 
     "sender" : "John doe", 
     "receiver" : "Elen doe" 
    }, 
    { 
     "content" : "test", 
     "user" : "9jZhXHjAkoY7mmX7B", 
     "created_at" : ISODate("2016-11-20T11:42:42.893Z"), 
     "isSeen" : false, 
     "sender" : "Elen doe", 
     "receiver" : "John doe" 
    } 
] 

Все, что я хочу, чтобы это «messages.isSeen» равно ложным и приемник не Meteor.user() имя пользователя..

И, наконец, как обновить это поле, чтобы оно стало истинным.

Надеюсь, кто-то может помочь! Заранее спасибо !

+0

Я не совсем уверен, но минимально поддерживает $ match и $ project? – blueren

+0

Вы можете проверить [это] (http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection) ответить – blueren

+0

Проблема Мне нужно найти разговор по id, а затем выбрать для сообщений, которые, к примеру, получатель - «John doe», а затем обновить поле. Я пробовал все, но ничего не работало! –

ответ

0

Вам необходимо включить _id в запросе и $set в обновлении.

let id = "yH8HmCPz6H6E8Hinq"; 
let username = Meteor.user().username; 
let query = { _id: id, messages: { $elemMatch: { isSeen: false, receiver: { $ne: username }}}}; 
Chat.update(query,{ $set: { "messages.$.isSeen": true }}); 
+0

Не работает! я действительно застрял в этом! –

+0

вот что говорит консоль: MongoError: не может использовать деталь (сообщения messages.isSeen), чтобы пересечь элемент ... –

+0

Мне очень жаль! он работает как шарм! Большое спасибо, сэр ! СПАСИБО ! –

0

Вам нужно что-то вроде:

Chat.update({ 
    'messages.isSeen': false,   // isSeen is false 
    'messages.receiver': {    // Receiver is 
    $ne: Meteor.user().username  // not equal to Meteor.user().username 
    } 
}, { 
    'messages.$isSeen': true   // Set isSeen to true 
}); 
+0

Мне нужно сначала найти разговор с идентификатором! потому что это уникальный разговор между x и y! и найдите, кто получит сообщение, а затем обновите поле isSeen. –

+0

Я думаю, что просто добавление поля '_id' в запрос выполнит задание. Вам не кажется? – tbking

+0

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