部分更新 JSON 在 Algolia 中使用特定键而不是 objectID 的对象
Partial Update JSON Object using specific key instead of objectID in Algolia
据我了解,要在 Algolia 中使用 PartialUpdateObject
,我需要知道 objectID
。 Source
但是,在我的情况下,我并不能立即直接知道 objectID
。让我解释一下...
我有一个音乐网站,艺术家可以在其中提交音乐,这个充满歌曲信息的 JSON 存储在 Algolia 的索引中。现在艺术家还可以更新他们的个人资料(更改他们的艺术家姓名等)。我有两个单独的索引。一个名为 Song
,其中包含所有歌曲信息,而 Artist
包含艺术家信息。当艺术家编辑他的个人资料以更改他的艺术家姓名时,我试图使此更改反映在他的 Artist
帐户 JSON 和 him/her 上传的所有歌曲中。如果 JSON 没有在歌曲端更新,它仍然会显示 his/her 旧名称...不好!
这是 Artist
JSON 的样子:
{
"AccountInfoID": 94,
"AccountType": "Artist",
"DisplayName": "Unlike Pluto",
"ImageURL": "https://ucarecdn.com/81abba2d-7966-48ac-abab-79a2ecc97811/",
"UserID": "",
"objectID": "94"
}
这是 Song
JSON 的样子。还要注意两个 json 文件之间的一个常量是 AccountInfoID
,这将歌曲链接到艺术家,在本例中与 Pluto 不同。 objectID
与 Song
不同。如果我要上传另一首歌曲,除了 AccountInfoID
(只是为了澄清)之外,以下所有值都会不同:
{
"ApprovalFL": true,
"FreeFL": true,
"LicenseFL": true,
"AccountInfoID": 94,
"AlbumID": 117,
"SongID": 105,
"BPM": 92,
"AccountImageURL": "https://ucarecdn.com/81abba2d-7966-48ac-abab-79a2ecc97811/",
"AccountType": "Artist",
"AlbumName": "Let It Bleed",
"Artist": "Unlike Pluto",
"FeaturedArtist": "Cristina Gatti",
"ImageURL": "https://ucarecdn.com/d60c9302-eacf-4050-920d-9d54ce93cd46/",
"iTunesURL": null,
"LabelName": "Lowly Palace",
"Title": "Let It Bleed",
"URL": "https://ucarecdn.com/b75e6e30-7082-49e5-b5d5-93d23e74af21/",
"UserID": "",
"UploadDate": "2017-12-16T01:55:22.81",
"Duration": "2017-12-16T00:03:20",
"objectID": "105"
}
更新艺术家JSON,没什么大不了的:
dynamic registerArtistObjs = new JObject();
registerArtistObjs.DisplayName = accountInfo.DisplayName;
registerArtistObjs.ImageURL = accountInfo.ImageURL;
registerArtistObjs.objectID = accountInfo.AccountInfoID;
var artistIndexHelper = HttpContext.Application.Get("ArtistIndexHelper") as IndexHelper<ArtistAlgoliaModel>;
artistIndexHelper.PartialUpdateObject(registerArtistObjs);
但是,歌曲更新比较棘手,因为我需要能够找到该艺术家上传的所有歌曲。因此,如上所述,我需要找到所有带有 AccountInfoID: 94
的歌曲,以便我可以获得 objectID
并更新歌曲 JSON 中的 Artist
。这样做的最佳方法是什么,或者我是否缺少更简单的方法?
这是我在歌曲索引中更新艺术家姓名的代码所在的位置,但我不知道如何从歌曲索引中获取包含的所有 objectID
值,例如, AccountInfo: 94
:
dynamic registerSongObjs = new JObject();
registerSongObjs.Artist = accountInfo.DisplayName;
registerSongObjs.objectID = ??????????Possibly Multiple values?????????
var songIndexHelper = HttpContext.Application.Get("SongIndexHelper") as IndexHelper<SongAlgoliaModel>;
songIndexHelper.PartialUpdateObject(registerSongObjs);
正如你所说,你 "need to be able to find all songs that were uploaded by that artist"。
如果您跟踪这个(我假设您的网站必须依赖某种数据库?),那么当更新艺术家时,您可以获取该艺术家的所有相关歌曲 ID,并从中推断列表您需要在 algolia 端更新的对象数量。
我通过执行以下操作解决了这个问题:
dynamic registerSongObjs = new JObject();
var songs = EntityDataAccess.GetSongsByAccountInfoID(accountInfo.AccountInfoID);
foreach (var item in songs)
{
registerSongObjs.Artist = accountInfo.DisplayName;
registerSongObjs.objectID = item.SongID;
songIndexHelper.PartialUpdateObject(registerSongObjs);
}
据我了解,要在 Algolia 中使用 PartialUpdateObject
,我需要知道 objectID
。 Source
但是,在我的情况下,我并不能立即直接知道 objectID
。让我解释一下...
我有一个音乐网站,艺术家可以在其中提交音乐,这个充满歌曲信息的 JSON 存储在 Algolia 的索引中。现在艺术家还可以更新他们的个人资料(更改他们的艺术家姓名等)。我有两个单独的索引。一个名为 Song
,其中包含所有歌曲信息,而 Artist
包含艺术家信息。当艺术家编辑他的个人资料以更改他的艺术家姓名时,我试图使此更改反映在他的 Artist
帐户 JSON 和 him/her 上传的所有歌曲中。如果 JSON 没有在歌曲端更新,它仍然会显示 his/her 旧名称...不好!
这是 Artist
JSON 的样子:
{
"AccountInfoID": 94,
"AccountType": "Artist",
"DisplayName": "Unlike Pluto",
"ImageURL": "https://ucarecdn.com/81abba2d-7966-48ac-abab-79a2ecc97811/",
"UserID": "",
"objectID": "94"
}
这是 Song
JSON 的样子。还要注意两个 json 文件之间的一个常量是 AccountInfoID
,这将歌曲链接到艺术家,在本例中与 Pluto 不同。 objectID
与 Song
不同。如果我要上传另一首歌曲,除了 AccountInfoID
(只是为了澄清)之外,以下所有值都会不同:
{
"ApprovalFL": true,
"FreeFL": true,
"LicenseFL": true,
"AccountInfoID": 94,
"AlbumID": 117,
"SongID": 105,
"BPM": 92,
"AccountImageURL": "https://ucarecdn.com/81abba2d-7966-48ac-abab-79a2ecc97811/",
"AccountType": "Artist",
"AlbumName": "Let It Bleed",
"Artist": "Unlike Pluto",
"FeaturedArtist": "Cristina Gatti",
"ImageURL": "https://ucarecdn.com/d60c9302-eacf-4050-920d-9d54ce93cd46/",
"iTunesURL": null,
"LabelName": "Lowly Palace",
"Title": "Let It Bleed",
"URL": "https://ucarecdn.com/b75e6e30-7082-49e5-b5d5-93d23e74af21/",
"UserID": "",
"UploadDate": "2017-12-16T01:55:22.81",
"Duration": "2017-12-16T00:03:20",
"objectID": "105"
}
更新艺术家JSON,没什么大不了的:
dynamic registerArtistObjs = new JObject();
registerArtistObjs.DisplayName = accountInfo.DisplayName;
registerArtistObjs.ImageURL = accountInfo.ImageURL;
registerArtistObjs.objectID = accountInfo.AccountInfoID;
var artistIndexHelper = HttpContext.Application.Get("ArtistIndexHelper") as IndexHelper<ArtistAlgoliaModel>;
artistIndexHelper.PartialUpdateObject(registerArtistObjs);
但是,歌曲更新比较棘手,因为我需要能够找到该艺术家上传的所有歌曲。因此,如上所述,我需要找到所有带有 AccountInfoID: 94
的歌曲,以便我可以获得 objectID
并更新歌曲 JSON 中的 Artist
。这样做的最佳方法是什么,或者我是否缺少更简单的方法?
这是我在歌曲索引中更新艺术家姓名的代码所在的位置,但我不知道如何从歌曲索引中获取包含的所有 objectID
值,例如, AccountInfo: 94
:
dynamic registerSongObjs = new JObject();
registerSongObjs.Artist = accountInfo.DisplayName;
registerSongObjs.objectID = ??????????Possibly Multiple values?????????
var songIndexHelper = HttpContext.Application.Get("SongIndexHelper") as IndexHelper<SongAlgoliaModel>;
songIndexHelper.PartialUpdateObject(registerSongObjs);
正如你所说,你 "need to be able to find all songs that were uploaded by that artist"。
如果您跟踪这个(我假设您的网站必须依赖某种数据库?),那么当更新艺术家时,您可以获取该艺术家的所有相关歌曲 ID,并从中推断列表您需要在 algolia 端更新的对象数量。
我通过执行以下操作解决了这个问题:
dynamic registerSongObjs = new JObject();
var songs = EntityDataAccess.GetSongsByAccountInfoID(accountInfo.AccountInfoID);
foreach (var item in songs)
{
registerSongObjs.Artist = accountInfo.DisplayName;
registerSongObjs.objectID = item.SongID;
songIndexHelper.PartialUpdateObject(registerSongObjs);
}