gpt4 book ai didi

ios - Firebase DB Architecting:基于两个条件(收藏夹和位置)进行过滤

转载 作者:行者123 更新时间:2023-12-01 18:05:58 27 4
gpt4 key购买 nike

在我的iOS应用中,我正在使用Firebase Realtime数据库,并且具有以下模型:用户和场所。

因此,用户可以收藏 field 。我想做的是能够看到我周围的人最喜欢的我周围的所有 field 。我的主要问题是我可以生成类似于FriendlyPix的“favoritedFeed”,但我确实需要考虑我与 field 的距离,并排除距离太远的 field 。

仅建立我关注的所有场所的“favoritedFeed”,然后在客户端按距离过滤供稿是否有益?另外,如果可能的话,我想对Feed进行分页,但是如果我采用这种方法,那可能是不可能的。

我将绘制我的JSON树,也许应该对其进行重组。

users
[user_id]

comments
[comment_id] = true
favorites
[venue_id] = true
comments
[comment_id]
user = [user_id]
comment = “…..”
venues
[venue_id]
...
favorites
[user_id] = true

现在,我只是遍历用户遵循的所有用户,然后获取他们的评论。这种方法的伸缩性不是很好,但是这是我目前想出办法的唯一方法。

最佳答案

因此,您可以使用几种不同的声音方法。根据您的用例,它们可能是最优化的解决方案。

将收藏夹存储在场所中并在那里查询

优点:实施非常简单,并且对大量产品有效。

缺点:如果您在成千上万个场所中都有成千上万个收藏夹,并且每个客户端都对该列表执行大量查询,则速度可能会变慢。不过,这可能是一个边缘情况,您可以从这里开始,并随着应用程序的增长轻松适应其他模型。

这种方法将使用类似于以下内容的数据结构:

venues/$venueid/favoritedby/$userid/<true>
venues/$venueid/meta/<detailed data about the venue could be stored here>
users/$userid/myfriends/$userid/<any data or just a true value here>

现在要获取场所列表,我需要做两件事:查找我的 friend 喜欢的场所,并根据接近程度过滤那些场所。我将在下面分别介绍附近情况,并着重于您如何在这里获得 friend 的最爱。
const ref = firebase.database().ref();
getMyFriends("kato")
.then(getFavoritesOfMyFriends)
.then(favorites => console.log(favorites));

function getMyFriends(myUserId) {
// find everyone I've marked as a friend
return ref.child(`users/${myUserId}/myfriends`)
.once('value').then(snap => {
// return the uids of my friends as an array
return Object.keys( snap.val() || {} );
});
}

function getFavoritesOfFriends(myListOfFriends) {
const promises = [];
// fetch favorites for each of my friends in parallel
// and merge them into one object, data will be deduped
// implicitly since we are storing in a hash
let mergedFavorites = {};
myListOfFriends.forEach(uid => {
promises.push(
getFavorites(uid)
.then(favs => mergeInto(mergedFavorites, favs))
);
});
return Promise.all(promises).then(() => mergedFavorites);
}

function getFavorites(uid) {
// fetch directly from venues
return ref.child('venues')
// but only get items favorited by this uid
.orderByChild(`favoritedby/${uid}`).equalTo(true)
.once('value')
// extract the data from snapshot before returning
.then(snap => snap.val() || {});
}

function mergeInto(dest, newData) {
Object.keys(newData).forEach(k => dest[k] = newData[k]);
return dest;
}

使用扁平化方法

优点:高度灵活,可与数百万个收藏夹配合使用,而不会造成实际性能损失

缺点:实现起来有点复杂-跳了一点点就可以抓取所有数据

这种方法将使用类似于以下内容的数据结构:
venues/$venueid/<detailed data about the venue is stored here>
users/$userid/myfriends/$userid/<any data or just a true value here>
favorites/$userid/$venueid/<any data or just a true value here>

现在,我可以获取我的 friend 列表,并找到他们喜欢的所有场所ID,如下所示。然后,我可以查找各个地点以获取名称/名称或根据我的位置进行过滤。
const ref = firebase.database().ref();

getMyFriends("kato").then(getFavoritesOfMyFriends).then(favorites => console.log(favorites));

function getMyFriends(myUserId) {
// find everyone I've marked as a friend
return ref.child(`users/${myUserId}/myfriends`).once('value').then(snap => {
// return the uids of my friends as an array
return Object.keys( snap.val() || {} );
});
}

function getFavoritesOfFriends(myListOfFriends) {
const promises = [];
// fetch favorites for each of my friends in parallel
// and merge them into one object, data will be deduped
// implicitly since we are storing in a hash
let mergedVenues = {};
myListOfFriends.forEach(uid => {
promises.push(
getFavorites(uid)
.then(getVenuesByKey)
.then(venues => mergeInto(mergedVenues, venues))
);
});
return Promise.all(promises).then(() => mergedVenues);
}

function getFavorites(uid) {
return ref.child(`favorites/${uid}`).once('value').then(snap => {
return Object.keys(snap.val()||{});
});
}

function getVenuesByKey(listOfKeys) {
const promises = [];
const venues = {};
listOfKeys.forEach(venueId => {
promises.push(
getVenue(venueId)
// add each entry to venues asynchronously
.then(v => venues[venueId] = v)
);
});
// Wait for all items to load then return the compiled list
return Promise.all(promises).then(() => venues);
}

function getVenue(venueId) {
return ref.child(`venues/${venueId}`).then(snap => snap.val() || {});
}

function mergeInto(dest, newData) {
Object.keys(newData).forEach(k => dest[k] = newData[k]);
return dest;
}

用于大规模

通常是供其他阅读此书的人以及为后代使用的:请注意,如果您正在运行类似Twitter的feed,其中名人可能拥有一百万个追随者或类似的场景,并且您确实需要在此处扩展,则可能会集成功能并使用类似的功能到存储过程中,实际上将有关喜爱地点的重复信息写到每个关注者的“提要”中,以提高规模。但是同样,大多数应用程序都不需要此功能,因此可以使其保持简单。

到目前为止,这是最复杂和可扩展的-当您开始编辑和更改场所数据时,它会变得很繁琐,并且存在很多边缘情况。强烈建议在尝试类似方法之前与 NoSQL data structures保持亲密关系。

通过geo 进行过滤

我将研究这些内容,以了解如何在本地最佳地过滤数据,但我怀疑您最终会得到如下所示:
  • 获取我附近的场所列表(请参阅GeoFire)
  • 抓住我 friend 的最爱
  • 做类似venuesCloseToMe.some(key => return favoritesOfMyFriends.indexOf(key) > -1);
  • 的操作
  • 现在按键获取这些场所以在客户端上显示
  • 关于ios - Firebase DB Architecting:基于两个条件(收藏夹和位置)进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44411978/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com