我用 Java 撰寫了以下 Aerospike 過濾器。Field1和都是Field2布林值。出于某種原因,“filterByField.ValidBoth”條件不會產生 true,盡管記錄與條件匹配。
因為它是一個布林值,所以我使用 1 表示真,使用 0 表示假。
我錯過了什么嗎?
public Exp getFilterByFieldFilter(FilterByField filterByField) {
if (filterByField == null || "".equals(filterByField)) {
return Exp.val(true);
}
if (filterByField == filterByField.All) {
return Exp.val(true);
} else if (filterByField == filterByField.ValidBoth) {
return Exp.and(Exp.eq(Exp.intBin("Field1"), Exp.val(0)),
Exp.eq(Exp.intBin("Field2"), Exp.val(0)));
}
}
從我通過 AQL 從資料庫結果中可以看到,那些未設定為 true 的內容不會反映在結果集中。
我應該寫我的過濾器是另一種檢查這種情況的方法嗎?如果是這樣,這種情況會是什么樣子?
我嘗試檢查 Exp.val(NULL) 但出現錯誤。
這是我通過 AQL 設定的資料庫結果
[
{
"PK": "1",
"Name": "ABC",
"Field1": 1,
"Field2": 1
},
{
"PK": "2",
"Name": "EFG",
"Field1": 1
},
{
"PK": "3",
"Name": "XYZ",
}
]
uj5u.com熱心網友回復:
如果 bin 名稱 Field1 和 Field2 包含布林值,那么您的運算式應該以這種方式構造(無論所需的邏輯是什么):
Exp.eq(Exp.boolBin("Field1"), Exp.val(false))
我測驗了下面的構造,似乎對我有用:
WritePolicy wPolicy = new WritePolicy();
Bin b1 = new Bin("Field1", Value.get(0));
Bin b2 = new Bin("Field2", Value.get(0));
Bin b3 = new Bin("Data", Value.get("data"));
wPolicy.recordExistsAction = RecordExistsAction.REPLACE;
client.put(wPolicy, key, b1, b2, b3);
//client.put(wPolicy, key, b1, b3);
Exp condFilter = Exp.and(
Exp.eq(Exp.intBin("Field1"),Exp.val(0) ),
Exp.eq(Exp.intBin("Field2"),Exp.val(0) )
);
Policy policy = new Policy();
policy.filterExp = Exp.build(condFilter);
Record record = client.get(policy, key);
System.out.println("Read back the record.");
System.out.println("Record values are:");
System.out.println(record);
//Get record without filter condition
record = client.get(null, key);
System.out.println(record);
有效條件:
Read back the record.
Record values are:
(gen:18),(exp:0),(bins:(Field1:0),(Field2:0),(Data:data))
(gen:18),(exp:0),(bins:(Field1:0),(Field2:0),(Data:data))
無效條件(無 Field2 bin):
Read back the record.
Record values are:
null
(gen:19),(exp:0),(bins:(Field1:0),(Data:data))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475572.html
上一篇:新資料庫條目時創建新產品頁面
