部分更新 JSON 在 Algolia 中使用特定键而不是 objectID 的对象

Partial Update JSON Object using specific key instead of objectID in Algolia

据我了解,要在 Algolia 中使用 PartialUpdateObject,我需要知道 objectIDSource

但是,在我的情况下,我并不能立即直接知道 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 不同。 objectIDSong 不同。如果我要上传另一首歌曲,除了 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);
                    }