1

MongoDB中,我試圖實現在「$ QueryResult中」與總提到的結果上的所有記錄,併爲了他們,我要選擇所有記錄形成一個集 ,責令陣列上,CAN你請幫忙。MongoDB的選擇陣列基礎

記錄在Db的

$recordsInDb = [ 
    ["coreId" => 10, "name" => 'a'], 
    ["coreId" => 20, "name" =>'a'], 
    ["coreId" => 30,"name" => 'a'] 
]; 

爲了查詢

$order = [20,10]; 

預期的效果

$queryResult = [ 
    {coreId:20,name:'a'} 
    {coreId:10,name:'a'}, 
    {coreId:30,name:'a'} 
] 

回答

1

想不出更好的方式比與創建一個附加陣列場集合中具有有序列表的每個文檔。展開該字段並使用$unwind運算符的includeArrayIndex屬性來生成索引位置。使用該信息對文檔進行排序,並使用額外的十進制運算符$cond評估邏輯表達式array element === coreId,並根據結果返回排序索引(如果爲true),否則返回常量n > order.length

下面顯示了上述方法,雖然有很大的改進空間,但至少應該給你一些方向。當然,這將是由你來管道輸送到相應的驅動程序語言轉換(我假設是PHP):

var order = [20, 10]; 
db.records.aggregate([ 
    { 
     "$project": { 
      "coreId" : 1, 
      "name" : 1, 
      "sortOrder": { "$literal": order } // create an additional field 
     } 
    }, 
    { 
     "$unwind": { 
      // flatten the above array 
      "path": "$sortOrder", 
      // create the index position for each array element 
      "includeArrayIndex": "sortIndex", 
     } 
    }, 
    { 
     "$project": { 
      "coreId": 1, 
      "name": 1, 
      "sortIndex": { 
       "$cond": [ 
        { "$eq": [ "$coreId", "$sortOrder" ] }, 
        "$sortIndex", 999999 
       ] 
      } 
     } 
    }, 
    { "$sort": { "sortIndex": 1 } }, 
    { 
     "$group": { 
      "_id": "$coreId", 
      "name": { "$first": "$name" }, 
      "index": { "$first": "$sortIndex" } 
     } 
    }, 
    { "$sort": { "index": 1 } }, 
    { 
     "$project": { 
      "_id": 0, 
      "coreId" : "$_id", 
      "name" : 1 
     } 
    } 
]) 

示例結果

/* 1 */ 
{ 
    "name" : "a", 
    "coreId" : 20 
} 

/* 2 */ 
{ 
    "name" : "a", 
    "coreId" : 10 
} 

/* 3 */ 
{ 
    "name" : "a", 
    "coreId" : 30 
}