问题描述
我正在使用Mongo聚合/过滤器/排序,并使用JAVA进行限制。
我有以下模型对象。 CustomPOJO
是我的数据库集合。
@Document(collation = "CustomPOJO")
public class CustomPOJO {
public List<keyvalueObject> valueList;
public String attribute1;
public String attribute2;
public CustomObject attribute3;
}
public class CustomObject {
public String attribute4;
public String attribute5;
}
public class keyvalueObject {
public String name;
public String value;
}
现在我的数据库中有以下记录条目
记录1:
{
"valueList": [{
"name": "field1","value": "value1"
},{
"name": "field2","value": "value2"
},{
"name": "field3","value": "value3"
}],"attribute1": "attribute1","attribute2": "attribute2","attribute3": {
"attribute4": "attribute4","attribute5": "attribute5"
}
}
记录2:
{
"valueList": [{
"name": "field1","value": "value4"
},"value": "value5"
},"value": "value6"
}],"attribute1": "attribute11","attribute2": "attribute22","attribute3": {
"attribute4": "attribute44","attribute5": "attribute55"
}
}
我可以使用 sort(DESC,"attribute1")
或 sort(DESC,"attribute3.attribute4")
或 sort(DESC,"attribute2")
对所有字段进行排序>。但是我无法对 valueList
进行排序。我想根据 keyvalue
中特定的 valueList
条目进行排序。
例如,record1的valueList带有条目field1
,因此数据库中的所有记录都应根据field1和其中的值进行排序。
通常,我想对列表属性内的字段进行排序。
任何帮助将不胜感激。
解决方法
您无法在适当位置使用数组的键值对进行排序。您可以使用聚合框架。
投影文档匹配键条目,然后对值进行排序,并从文档中删除其他字段。
类似
db.collection.aggregate(
[
{"$set":{
"sortdoc":{
"$arrayElemAt":[
{
"$filter":{
"input":"$valueList","cond":{"$eq":["$$this.name","field1"]}
}
},0]}
}},{"$sort":{"sortdoc.value":-1}},{"$project":{"sortdoc":0}}
])
https://mongoplayground.net/p/gzLQm8m2wQW
您也可以像对待属性一样将valueList建模为对象。使用Document类或HashMap代替值列表,并使用sort(DESC,"document.field1")
@Document(collation = "CustomPOJO")
public class CustomPOJO {
public Document document;
public String attribute1;
public String attribute2;
public CustomObject attribute3;
}
文档
{
"document": {
"field1": "value1","field2": "value2"
},"attribute1": "attribute1","attribute2": "attribute2","attribute3": {
"attribute4": "attribute4","attribute5": "attribute5"
}
}
,
您不能直接对Array内字段上的文档进行排序。通常,我要做的是function woocommerce_custom_add_to_cart_text( $add_to_cart_text,$product ) {
// Get cart
$cart = WC()->cart;
// If cart is NOT empty
if ( ! $cart->is_empty() ) {
// Iterating though each cart items
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Get product id in cart
$_product_id = $cart_item['product_id'];
// Compare
if ( $product->get_id() == $_product_id ) {
// Change text
$add_to_cart_text = __( 'Already in cart','woocommerce' );
break;
}
}
}
return $add_to_cart_text;
}
add_filter( 'woocommerce_product_add_to_cart_text','woocommerce_custom_add_to_cart_text',10,2 );
数组,然后执行排序。
也许这对您有帮助。
unwind