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 
}