我正在使用mongodb并正在构建一个包含两个集合的应用程序:用户和项目。
我希望用户能够保存他们喜欢的项目并转到他们的已保存的项目页面,其中项目将以与保存相反的顺序显示(上次保存首先出现)。
目前,我正在将每个已保存的项目 ID 以及 savedDate 添加到用户的个人资料 savedItems 数组如此:
user profile
{
savedItems: [{id: "", savedDate: ""}, {id: "", savedDate: ""}, etc...]
}
每当我需要检索这些项目时,我都会在此数组中查询具有ids $的对象的项集合。像这样:
var items = Items.find({_id: {$in: _.pluck(user.savedItems, 'id')}});
这里的问题是我无法根据添加的日期订购这些商品。
那么可以将addedDate映射到检索到的项目的每个对象上吗?
(如: if retrieveItems.id == savedItems.id,然后将addedDate推送到那里。)
这会导致像这样的项数组:
[
{id:"", itemName:"", price: "", [...], savedDate: ""},
{id:"", itemName:"", price: "", [...], savedDate: ""},
[...]
]
谢谢。
答案 0 :(得分:0)
我创建了两个函数来帮助你做到这一点:
function mergeDates(listDates, listItems) {
for (var i = 0; i < listDates.length; i++) {
var index = findListIndex(listItems, listDates[i].id);
if (index != null) listItems[index].savedDate = listDates[i].savedDate;
}
return listItems;
}
function findListIndex(listItems, id) {
for (var i = 0; i < listItems.length; i++) {
if (listItems[i].id == id) return i;
}
return null;
}
第一个,mergeDates,第一个列表包含日期,第二个列表listItems是你的项目列表。
我使用日期循环列表,并且对于其中的每个项目,我调用第二个函数返回第二个列表中相同元素的索引,因此findListIndex将搜索所有元素并在找到相同时返回它的索引标识。
现在函数mergeDates与新发现的索引一起,将值savedDate添加到listItems并使其等于listDates上的值!
然后该函数返回列表,其中包含所有项目信息,包括日期!
以下是调用函数的方法:
var listWithDate = mergeDates(savedItems, items);
希望它有所帮助!