2013-03-11 6 views
2

Я только начал смотреть на метеорит, и я застреваю, пытаясь обновить запись внутри массива в записи. У меня есть документ, который выглядит примерно так:Обновление записей в массивах

Users: 
{ 
    _id: "somerandom", 
    name: "name1", 
    items, [ 
    { 
     name: "item1", 
     data: "somedata", 
     ... 
    }, 
    { 
     name: "item2", 
     data: "somedata", 
     ... 
    } 
    ], 
    ... 
}, 
... 

И я хочу обновить данные пунктов item1. Я не могу найти что-нибудь о том, как сделать это в метеора, но от того, что я читал о MongoDB Я думаю, что правильный путь будет что-то вроде

Users.update({_id: userId, "items.name": 'item1}, {$set: {"items.$.data": newData}}); 

но с MongoDB используется в Метеор не поддерживает $ это не сработает, с другой стороны, я могу быть способом, как это должно быть сделано.

У кого-нибудь есть решение для этого?

ответ

2

Используйте Meteor.methods() и реализуйте операцию с базой данных на стороне сервера и вызывайте ее с помощью Meteor.call() с клиента. Эта функция еще не реализована в Метеор, и она задокументирована here.

Подробнее об этом выпуске можно прочитать в Github, here.

+0

На самом деле я этого не понимаю. могу ли я использовать $ selector на стороне сервера? – Kempe

+0

Да. Это обходное решение, предложенное в соответствии с обсуждением, или то, что вы предложили ниже, тоже чисто. – Prashant

+0

Я могу подтвердить, что говорит Прашант. отлично работает, если я делаю это в методе сервера, но не в клиенте. отстой, было бы неплохо сделать это в клиенте. – Ben

1

Я нашел обходной путь на GitHub метеора https://github.com/meteor/meteor/blob/master/examples/parties/model.js

Идея заключается в том, чтобы сначала получить индекс массива-элемент, который вы хотите изменить, и затем использовать этот индекс вместо $. Так что в этом случае это было бы что-то вроде

user = Users.findOne(userId); 
index = _.indexOf(_.pluck(user.items, 'name'), 'item1'); 

modifier = {$set: {}}; 
modifier.$set["items." + index + ".data"] = newData; 
Users.update(userId, modifier); 
+0

Это действительно помогло мне - спасибо! – Rob

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