mam następujące (uproszczony) schematu SimpleSchema w moim Meteor 1.1.0.2 app:Pull wpisu z tablicy poprzez Meteor
Tickers.attachSchema(
new SimpleSchema({
entries: {
type: [TickerEntries],
defaultValue: [],
optional: true
}
})
);
TickerEntries = new SimpleSchema({
id: {
type: String,
autoform: {
type: "hidden",
label: false,
readonly: true
},
optional: true,
autoValue: function() {
if (!this.isSet) {
return new Mongo.Collection.ObjectID()._str;
}
}
},
text: {
type: String,
label: 'Text'
}
};
w bazie mam następujące wpisy:
{
"_id" : "ZcEvq9viGQ3uQ3QnT",
"entries" : [
{
"text" : "a",
"id" : "fc29774dadd7b37ee0dc5e3e"
},
{
"text" : "b",
"id" : "8171c4dbcc71052a8c6a38fb"
}
]
}
Chciałbym usunąć jeden wpis z tablicy wpisów określonej przez identyfikator.
Gdybym wykonać następujące polecenie w Meteor-MongoDB-shell to działa bez problemów:
db.Tickers.update({_id:"3TKgHKkGnzgfwqYHY"}, {"$pull":{"entries": {"id":"8171c4dbcc71052a8c6a38fb"}}})
Ale problemem jest to, że jeśli mam zamiar zrobić to samo z poziomu Meteor to robi nie działa. Oto mój kod:
Tickers.update({id: '3TKgHKkGnzgfwqYHY'}, {$pull: {'entries': {'id': '8171c4dbcc71052a8c6a38fb'}}});
Ja również próbowałem następujące:
Tickers.update('3TKgHKkGnzgfwqYHY', {$pull: {'entries': {'id': '8171c4dbcc71052a8c6a38fb'}}});
Żadne z tych poleceń dać mi błąd, ale nie usunąć wszystko z mojego dokumentu.
Czy to możliwe, że polecenie $pull
nie jest obsługiwane poprawnie lub czy gdzieś popełniłem błąd?
Z góry dziękuję!
EDYCJA: Znalazłem problem, którego nie można zobaczyć w moim opisie, ponieważ uprościłem mój schemat. W mojej aplikacji jest dodatkowy atrybut timestamp
w TickerEntries
:
TickerEntries = new SimpleSchema({
id: {
type: String,
optional: true,
autoValue: function() {
if (!this.isSet) {
return new Mongo.Collection.ObjectID()._str;
}
}
},
timestamp: {
type: Date,
label: 'Minute',
optional: true,
autoValue: function() {
if (!this.isSet) { // this check here is necessary!
return new Date();
}
}
},
text: {
type: String,
label: 'Text'
}
});
Dzięki wskazówce od Kyll, Utworzyłem Meteorpad i okazało się, że funkcja autovalue
jest przyczyną problemów.
Mam teraz zmienił funkcję na następujący kod:
autoValue: function() {
if (!this.isSet && this.operator !== "$pull") { // this check here is necessary!
return new Date();
}
}
A teraz pracuje. Wydaje się, że zwracanie wartości auto wartości w przypadku ciągnięcia elementu/obiektu powoduje anulowanie operacji przeciągania, ponieważ wartość nie jest ustawiona na zwróconą wartość (tak, że atrybut znacznika czasu zachowuje starą wartość, ale nie jest ciągnięty).
Oto według Meteorpad przetestować go (po prostu skomentuj czek dla operatora w funkcji autovalue): http://meteorpad.com/pad/LLC3qeph66pAEFsrB/Leaderboard
Dziękuję wszystkim za pomoc, wszystkie Twoje posty były bardzo pomocne dla mnie!
Proponuję sporządzania się w [MeteorPad] (http://meteorpad.com/), aby pokazać swój problem (tworzenie DB, dodać schematów, wypełnić go, spróbuj usunąć i pokazać niepowodzenie). Kolejna kwestia: czy usunięcie załączonych schematów zmienia cokolwiek w twoim problemie? Jeśli nie, możesz całkowicie usunąć je z pytania, ponieważ tak naprawdę nie wiem, czy schematy mają znaczenie, czy też nie. Na koniec gratuluję formatu i czystości Twojego posta! Jeśli dodasz znacznik [tag: javascript] do pytania, automatycznie doda on kolory do kodu. –
Sugeruję, że popełniłeś błąd lub masz błąd konfiguracji lub gdzieś się kłócisz. Przesłałem odpowiedź, która pokazuje w pełni sprawną sprawę. Pomoże to zawęzić wszelkie problemy, które mogą wystąpić, jeśli coś innego zakłóca oczekiwane zachowanie '$ pull'. –
Naprawiono nasze problemy - autovalue blokowało $ pull. Dziękuję za dokładne pytanie i odpowiedź @ reini122. –