Firebase NodeJS SDK:在嵌套对象上按值查询



我有一个结构如下的集合/表:

{
UsedPromos: {
"userid_1": {
"product_1_1": "promo_1_1",
"product_1_2": "promo_1_2",
...
"product_1_n": "promo_1_n",
},
"userid_2": {
"product_2": "promo_2"
},
...
"userid_m": {
...
}
}
}

如何查询与某些"promo_x_y"精确匹配?我已经试过了:

const admin = require("firebase-admin");
admin.initializeApp(...);
const ref = admin.database().ref("/UsedPromos");
ref.orderByValue()
.equalTo("promo_x_y")
.once("child_added")
.then((snapshot) => {
console.log(`{key: ${snapshot.key}, value: ${snapshot.val()}}`);
return snapshot
});

但是它没有返回任何东西。

如果您正在查找促销活动promo_x_y的所有产品,则需要比当前所做的更深入地调整您的查询。

当前正在比较user_1user_2等的值与"promo_x_y"的值。您没有得到任何结果,因为没有条目/UsedPromos/user_1 = "promo_x_y"存在。

/UsedPromosByUser/{user}/{product} = {promo} (your current structure)

要解决这个问题,您需要搜索单个用户的产品列表。使用下面的代码片段将记录每个值为"promo_x_y"的产品。

const admin = require("firebase-admin");
admin.initializeApp(/* ... */);
const ref = admin.database().ref("/UsedPromos");
const userToSearch = "user_1";
ref.child(userToSearch)
.orderByValue()
.equalTo("promo_x_y")
.once("child_added")
.then((snapshot) => {
// snapshot.val() will always be "promo_x_y", so don't bother logging it.
console.log(`${snapshot.key} uses "promo_x_y"`);
return snapshot;
});

根据您的用例,使用"value"事件可能会更好。

const admin = require("firebase-admin");
admin.initializeApp(/* ... */);
const ref = admin.database().ref("/UsedPromos");
const userToSearch = "user_1";
ref.child(userToSearch)
.orderByValue()
.equalTo("promo_x_y")
.once("value")
.then((querySnapshot) => {
const productKeys = [];
// productSnapshot.val() will always be "promo_x_y", so don't bother logging it.
querySnapshot.forEach((productSnapshot) => productKeys.push(productSnapshot.key));

console.log(`The following products have a value of "promo_x_y" for user "${userToSearch}": ${productKeys.join(", "}`);
return productKeys;
});

如果您希望查找所有用户中使用&;promo_x_y&;的所有产品,您应该在数据库中创建索引,而不是使用查询。

/UsedPromosByPromo/{promo}/{user}/{product} = true
OR
/UsedPromosByPromo/{promo}/{product}/{user} = true

您可以存储时间戳(购买时间、促销过期时间等),而不是在上述结构中使用true

最新更新