Mongo SORT,具有属性列表中的特定条目

问题描述

我正在使用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

Mongo Playground

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...