好的,这将是一个复杂的问题,我希望我说的很清楚。完全入场,我昨天刚刚完成了一个训练营,所以我不知道有很多技术,我想我可能需要额外的技术来完成我想要的……
现在,我有一个应用程序,它使用bandsintown API调用来填充数据库。我注意到,bandsintown与每个对象中的数据返回不一致,这使得检索对象后的操作变得困难/似乎不可能。例如,在同一地点表演的不同艺术家返回不同的纬度、经度、场地名称等。
这里是Primus在Bonnaroo玩:
{
"offers": [],
"venue": {
"country": "United States",
"city": "Manchester",
"latitude": "35.4839582",
"name": "Bonnaroo Music and Arts Festival 2020",
"location": "",
"region": "TN",
"longitude": "-86.08963169999998"
},
"datetime": "2020-09-25T12:00:00",
"on_sale_datetime": "",
"description": "",
"lineup": [
"Primus"
],
"bandsintown_plus": false,
"id": "1020701795",
"title": "",
"artist_id": "1263",
"url": "https://www.bandsintown.com/e/1020701795?app_id=451f31b2808001d069daed45c32a9dac&came_from=267&utm_medium=api&utm_source=public_api&utm_campaign=event"
}
与每周在Bonnaroo的比赛相比:
{
"id": "18604416",
"url": "https://www.bandsintown.com/e/18604416?app_id=451f31b2808001d069daed45c32a9dac&came_from=267&utm_medium=api&utm_source=public_api&utm_campaign=event",
"datetime": "2017-05-17T19:00:00",
"title": "",
"description": "",
"venue": {
"location": "",
"name": "Bonnaroo",
"latitude": "35.476247",
"longitude": "-86.081026",
"city": "Manchester",
"country": "United States",
"region": "TN"
},
"lineup": [
"The Weeknd"
],
"offers": [],
"artist_id": "1371750",
"on_sale_datetime": "",
"bandsintown_plus": false
}
我现在的问题是我希望聚合和$group中的MongoDB,因为这两个事件在Bonnaroo,但对象{venue.name}是不一样的.甚至经纬度也不一样所以我也不能用。我想知道是否有一种方法可以自动更改对象的数据,而不必进入DB并编辑单个对象。这两个事件都包括单词Bonnaroo,所以我可以找到一些东西并匹配文本,然后分割出不相似的文本吗?如果是这样的话,我可以使用匹配的场地名称字段作为引用来更改纬度和经度值吗?
我希望我是清楚的,如果我不是的话,随时可以问一些澄清性的问题。这个网站已经帮了我很多次了,我很感激社区为互相帮助所付出的一切努力!提前谢谢!
~编辑~感谢您的第一个回复@morad。
因此,在看到您的答复之前,我能够构建一些内容,将数据分解为一个数组,这与您提供的内容相同。唯一不起作用的是索引的$arrayToElem,因为有一些场所:
使用这个Bonnaroo示例,我有一个新字段,将每个单词作为数组中的值返回:
"venueName": ["Bonnaroo", "Music", "and","Arts","Festival","2020"]
我的下一步将是比较'Primus‘对象和'The Weeknd’对象的venueName,找出数组中的值是相同的,并将它们返回到"venueName“的值。
希望这更有意义,我感谢你的投入!
发布于 2021-04-20 20:52:13
实际的诀窍取决于您的数据,如果您提供的数据没有描述整个问题,您应该提供更多的数据。
换句话说,你想潜入多深的地方。
最愚蠢的答案,至少是你提供的数据
db.prod4.aggregate([
{
$addFields: {
venueName: {
$arrayElemAt: [{ $split: ['$venue.name', ' '] }, 0],
},
},
},
])
当然不是这样,我想到的是同一地点的地理位置不应该离对方很远,例如,你提供的两个地点的数据是在1.16公里内。
因此,另一个可行的虚拟解决方案是编写一个简单的脚本,从所有数据的数组中选择一个随机元素,并查找数据,例如lat/lng在该点的2公里内,并从数组中删除这些元素,并从数组中选择另一个随机元素,并执行相同的操作。
如果您提供更多的数据,它将更容易,因为最简单的解决方案是找到许多模式,并只为它们进行规划。
https://stackoverflow.com/questions/67185476
复制相似问题