我得到了一个Firebase实时数据库(js sdk),在其中我为每个位置(组/位置/项目/ {locationId} / usercount)计数用户。在根级别,我还有一个用户列表,其中每个用户都有一个位置列表。在这些位置的每个位置中,我都有一个计数器,用于对该位置的用户总数进行计数(用户/ {userId} /组/位置/项/项/ {locationId} /用户数)。
a)因此,每当将用户添加到groups / location / Items / {locationId} / users的位置时,groups / location / Items / {locationId} / usercount的计数器都会增加。
b)同时,对于在users / {userId} / groups / location / Items /中具有此位置的每个用户,在users / groups / location / Items / {locationId} / usercount上的计数器也会增加。 / p>
在下面,您将找到json数据结构以及应该增加两个计数器(a和b)的云函数。该功能的(a)部分可以正常运行。至于(b)部分,它仅适用于刚添加到组/位置/项目/ {locationId} /用户(根据json的用户yjXidCKJuYZ71TNzYe9ob5Raaub2)上的用户,而不适用于用户/ {userId}上的所有用户。>
我需要此功能来增加用户/ {userId}中具有添加用户位置的用户的所有计数器。
我希望我已经足够清楚,并希望在此方面提供一些帮助。也许我不应该使用交易。
非常感谢!
"groups" : {
"location" : {
"Items" : {
"NA" : {
"code" : "NA",
"created" : "2019-04-03--19:10:11",
"id" : "NA",
"label" : "North America",
"levelIndex" : 1,
"levelName" : "Continent",
"type" : "location",
"usercount" : 2,
"users" : {
"Xi6XiXdxDAWqvjmSUeobnhDTe4k2" : {
"created" : "2019-04-03--19:10:11",
"id" : "Xi6XiXdxDAWqvjmSUeobnhDTe4k2",
"ip" : "hidden",
"label" : "Anonymous"
},
"yjXidCKJuYZ71TNzYe9ob5Raaub2" : {
"created" : "2019-04-03--19:10:11",
"id" : "yjXidCKJuYZ71TNzYe9ob5Raaub2",
"ip" : "hidden",
"label" : "Anonymous"
}
}
}
}
}
},
"users" : {
"Xi6XiXdxDAWqvjmSUeobnhDTe4k2" : {
"created" : "2019-04-03--19:10:11",
"groups" : {
"location" : {
"Items" : {
"NA" : {
"code" : "NA",
"created" : "2019-04-03--19:10:11",
"id" : "NA",
"label" : "North America",
"levelIndex" : 1,
"levelName" : "Continent",
"type" : "location",
"usercount" : 1
}
}
}
},
"id" : "Xi6XiXdxDAWqvjmSUeobnhDTe4k2",
"ip" : "hidden",
"label" : "Anonymous"
},
"yjXidCKJuYZ71TNzYe9ob5Raaub2" : {
"created" : "2019-04-03--19:10:11",
"groups" : {
"location" : {
"Items" : {
"NA" : {
"code" : "NA",
"created" : "2019-04-03--19:10:11",
"id" : "NA",
"label" : "North America",
"levelIndex" : 1,
"levelName" : "Continent",
"type" : "location",
"usercount" : 2
}
}
}
},
"id" : "yjXidCKJuYZ71TNzYe9ob5Raaub2",
"ip" : "hidden",
"label" : "Anonymous"
}
}
}
exports.onUserAddToLocation = functions.database
.ref('/groups/location/Items/{itemId}/users/{userId}')
.onCreate((snapshot, context) => {
const itemId = context.params.itemId
const userId = context.params.userId
const groupCounterRef = admin.database().ref('/groups/location/Items/' + itemId + '/usercount');
return groupCounterRef.transaction(usercount => {
return (usercount || 0) + 1
}).then(result => {
const count = result.snapshot.val();
const userGroupsCounterRef = admin.database().ref('/users/' + userId + '/groups/location/Items/' + itemId + '/usercount');
userGroupsCounterRef.transaction(usercount => {
return count
})
})
})
答案 0 :(得分:0)
这可以解决问题:
.ref('/groups/location/Items/{itemId}/users/{userId}')
.onCreate((snapshot, context) => {
const itemId = context.params.itemId
const groupCounterRef = admin.database().ref('/groups/location/Items/' + itemId + '/usercount');
return groupCounterRef.transaction(usercount => {
return (usercount || 0) + 1
}).then(result => {
const count = result.snapshot.val();
const usersRef = admin.database().ref("users").orderByKey();
usersRef.once("value")
.then(function(snapshot) {
snapshot.forEach(function(childSnapshot){
const userId = childSnapshot.key
const userLocationCountersRef = admin.database().ref('users/' + userId + '/groups/location/Items/' + itemId)
const hasThisGroup = childSnapshot.hasChild('/groups/location/Items/' + itemId)
if(hasThisGroup){
userLocationCountersRef.update({usercount:count})
}
})
})
})
})
这将为添加到位置的每个用户增加一个计数器。交易成功后,它将该计数器值复制到具有此位置的每个用户。