У меня есть элементы в коллекции, которые проходят через этот агрегат, чтобы найти их со средней оценкой и найти их, когда они еще не были прокомментированы / оценены.
Это работает, но каждый раз, когда я обновляю страницу сейчас, он создает дубликат, отображаемый в ng-repeat каждого элемента в коллекции бурбона. Фактическое количество предметов в коллекции бурбона не меняется. Как мне остановить это? СЕРВЕРНАЯ СТОРОНА: схема бурбона:
'use strict';
var mongoose = require('mongoose'),
BourbonSchema = null;
module.exports = mongoose.model('Bourbon', {
name: {type: String, required: true},
blog: {type: String, required: true},
photo: {type: String, required: true, default:'http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg'},
location: {type: String, required: true},
distillery: {type: String, required: true},
comments: [{type: mongoose.Schema.ObjectId, ref: 'Comments'}],
rating : {type: Number}
});
var Bourbon = mongoose.model('Bourbon', BourbonSchema);
module.exports = Bourbon;
схема комментария/рейтинга:
'use strict';
var mongoose = require('mongoose');
module.exports = mongoose.model('Comment', {
bourbonId: {type: mongoose.Schema.ObjectId, ref: 'Bourbon'},
userId: {type: mongoose.Schema.ObjectId, ref: 'User'},
text: {type: String, required: true},
createdAt: {type: Date, required: true, default: Date.now},
rating : {type: Number, required: true},
votes: {type: Number, default: 0}
});
агрегатная функция:
'use strict';
var Bourbon = require('../../../models/bourbon'),
Comment = require('../../../models/comment'),
DataStore = require('nedb'),
db = new DataStore(),
async = require('async');
module.exports = {
description: 'Get Bourbons',
notes: 'Get Bourbons',
tags: ['bourbons'],
handler: function(request, reply){
async.series(
[
function(callback){
Bourbon.find({},function(err,results){
//if (err) callback(err);
async.eachLimit(results,10,function(result,callback){
var plain = result.toObject();
plain.bourbonId = plain._id.toString();
plain.avgRating = 0;
delete plain._id;
db.insert(plain,callback);
},callback);
});
},
function(callback){
Comment.aggregate(
[
{$group:{
_id: '$bourbonId',
avgRating:{$avg:'$rating'}
}}
],
function(err,results){
async.eachLimit(results,10,function(result,callback){
db.update(
{bourbonId: result._id.toString()},
{$set: {avgRating: result.avgRating}},
callback
);
},callback);
}
);
}
],
function(err){
//if (err) callback(err);
db.find({}, {_id: 0}, function(err, bourbons){
console.log('DOOOOCS', bourbons);
reply ({bourbons:bourbons});
});
});
}
};
Сторона клиента
factory:
(function(){
'use strict';
angular.module('hapi-auth')
.factory('Bourbon', ['$http', function($http){
function create(bourbon){
return $http.post('/admin', bourbon);
}
function all(){
return $http.get('/admin');
}
return {create:create, all:all};
}]);
})();
контроллер:
(function(){
'use strict';
angular.module('hapi-auth')
.controller('AdminCtrl', ['$scope', 'Bourbon', function($scope, Bourbon){
//$scope.blog.photo = [];
$scope.bourbon = {};
$scope.bourbons = [];
Bourbon.all().then(function(res){
$scope.bourbons = res.data.bourbons;
console.log(res.data.bourbons);
});
$scope.createBourbon = function(bourbon){
console.log('BOURBB', bourbon);
Bourbon.create(bourbon).then(function(res){
console.log('bourboonnnn', res.data);
$scope.bourbons.push(res.data);
});
};
}]);
})();
Джейд:
.row
.small-4.columns
.small-4.columns
.review
.insertContainer(ng-repeat='bourbon in bourbons')
.adminName Name: {{bourbon.name}}
img.bourbonImg(src='{{bourbon.photo}}')
.adminBlog {{bourbon.blog.slice(0,200)}} ...
.small-4.columns
пытаюсь остановить дублирование элементов в коллекции бурбона при обновлении страницы.... Не уверен, что мне нужно реализовать здесь какой-то метод замены... немного застрял сейчас...
Вот что возвращает журнал консоли в функции контроллера/агрегата:
DOOOOCS [ { name: 'woodford reserve',
location: 'kentucky',
distillery: 'woodford',
blog: 'fjkd;asdljfkld;ksdfj',
__v: 0,
comments: [],
photo: 'http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg',
bourbonId: '54c2aa5556267e0000b5618c',
avgRating: 0 },
{ name: 'woodford reserve',
location: 'kentucky',
distillery: 'woodford',
blog: 'fjkd;asdljfkld;ksdfj',
__v: 0,
comments: [],
photo: 'http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg',
bourbonId: '54c2aa5556267e0000b5618c',
avgRating: 0 } ]
кажется, что каждый элемент в коллекции Bourbon дублируется всякий раз, когда эта функция запускается... , которая запускается при обновлении страницы как Bourbon.all в контроллере angular.
это бурбон в коллекции, до того, как он пройдет через агрегат:
{
"_id" : ObjectId("54c2aa5556267e0000b5618c"),
"name" : "woodford reserve",
"location" : "kentucky",
"distillery" : "woodford",
"blog" : "fjkd;asdljfkld;ksdfj",
"comments" : [],
"photo" : "http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg",
"__v" : 0
}
обновлен Джейд с треком от:
.row
.small-4.columns
.small-4.columns
.review
.insertContainer(ng-repeat='bourbon in bourbons | unique: bourbon.bourbonId | filter: query')
.adminName Name: {{bourbon.name}}
img.bourbonImg(src='{{bourbon.photo}}')
.adminBlog {{bourbon.blog.slice(0,200)}} ...
.small-4.columns
это позволяет отображать элементы при первой загрузке, но при любом обновлении/перезагрузке теперь я получаю эту ошибку:
Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: bourbon in bourbons track by bourbon.bourbonId | filter:query, Duplicate key: 54c2aa5556267e0000b5618c, Duplicate value: {"name":"woodford reserve","location":"kentucky","distillery":"woodford","blog":"fjkd;asdljfkld;ksdfj","__v":0,"comments":[],"photo":"http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg","bourbonId":"54c2aa5556267e0000b5618c","avgRating":0}
http://errors.angularjs.org/1.3.8/ngRepeat/dupes?p0=bourbon%20in%20bourbons…C%22bourbonId%22%3A%2254c2aa5556267e0000b5618c%22%2C%22avgRating%22%3A0%7D
at http://localhost:7070/vendor/angular/angular.js:63:12
at ngRepeatAction (http://localhost:7070/vendor/angular/angular.js:24483:21)
at Object.$watchCollectionAction [as fn] (http://localhost:7070/vendor/angular/angular.js:14092:13)
at Scope.$digest (http://localhost:7070/vendor/angular/angular.js:14225:29)
at Scope.$apply (http://localhost:7070/vendor/angular/angular.js:14488:24)
at done (http://localhost:7070/vendor/angular/angular.js:9646:47)
at completeRequest (http://localhost:7070/vendor/angular/angular.js:9836:7)
at XMLHttpRequest.requestLoaded (http://localhost:7070/vendor/angular/angular.js:9777:9)
это элементы бурбона, возвращаемые в консоли браузера. все они имеют одинаковый bourbonId, начиная с индекса 0. Уникальный фильтр теперь возвращает 2 объекта бурбона (оригинал и один из дубликатов?) вместо всех из них...:
[Объект, Объект, Объект, Объект, Объект]0: Объект$$hashKey: "object:6"v: 0avgRating: 4blog: "fjkd;asdljfkld;ksdfj"bourbonId: "54c2aa5556267e0000b5618c", комментарии: Array[0] винокурня: "Вудфорд"местоположение: "Кентукки"название: "Вудфорд Резерв"фото: "http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg"__proto: Object1: Object__v: 0avgRating: 4blog: «fjkd; asdljfkld; ksdfj» идентификатор бурбона: «54c2aa5556267e0000b5618c» комментарии: массив[0]вискикурня: «вудфорд»местоположение: «кентукки»название: «вудфорд заповедник»фото: «http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg"proto: Object2: Object$$hashKey: "object:7"v: 0avgRating: 0blog: "fjkd;asdljfkld;ksdfj"bourbonId: "54c2aa5556267e0000b5618c"комментарии: Array[ 0]длина: 0__прото: А rray[0]вискикурня: "Вудфорд"местоположение: "Кентукки"название: "Вудфорд Резерв"фото: "http://aries-wineny.com/wp-content/uploads/2014/09/woodford-backup.jpg"прототип: Object3 : Object__v: 0avgRating: 0blog: "fjkd;asdljfkld;ksdfj"bourbonId: "54c2aa5556267e0000b5618c"комментарии: Array[0]length: 0__proto__: Array[0]вискикурня: "woodford"местоположение: "kentucky"название: "woodford Reserve"photo : "http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg"proto: Object4: Object__v: 0avgRating: 0blog: "fjkd;asdljfkld;ksdfj"bourbonId: "54c2aa5556267e0000b5618c"комментарии: Массив[0]длина: 0__proto__: Массив[0]вискикурня: "вудфорд"местоположение: "кентукки"название: "вудфорд заповедник"фото: "http://aries-wineny.com/wp-content/uploads/2014/09/woodford-reserve.jpg"proto: Objectlength: 5__proto__: Array[0]
Я думаю, что я сузил это до проблемы на стороне сервера, в контроллере/агрегате, указанном выше. Мне нужно найти способ заменить обновленные документы, а не создавать новый каждый раз, когда Bourbon.all вызывается/запускается на стороне клиента/браузере... пытаюсь решить эту проблему сейчас. Любые советы, высоко ценится.
ng-repeat='bourbon in bourbons track by id
id будет вашим уникальным ключом объекта. - person Pankaj Parkar   schedule 23.01.2015ng-repeat='bourbon in bourbons track by bourbon.bourbonId'
должно работать - person Pankaj Parkar   schedule 24.01.2015ng-repeat='bourbon in bourbons track by $index'
- person Pankaj Parkar   schedule 24.01.2015Preview
илиResponse
- person Pankaj Parkar   schedule 24.01.2015findAndModify
вместоfind
- person Pankaj Parkar   schedule 24.01.2015