基于字段值指定的嵌入对象的字段值对MongoDB集合进行排序?

时间:2018-02-23 11:14:51

标签: mongodb aggregation-framework

在MongoDB中,我如何根据另一个字段值指定的嵌入对象的字段值来排序查询结果?

以下是数据的表示:

{
field1 : 'value',
field2: 'value',
data: [
    fields": [
    {
    _id: "5a8fdd13de5b074d4d4f572c",
    field: "location",
    value: "Antwerp"
    },
    {
    _id: "5a8fdd13de5b074d4d4f572b",
    field: "title",
    value: "This is a good title"
    },
    {
    _id: "5a8fdd13de5b074d4d4f572a",
    field: "employmentType",
    value: "Temporary"
    }
]}

例如,我有一个包含此类文档的集合,我想根据data.fields.value对整个集合进行排序。我唯一拥有的是data.fields.field

我该怎么做?提前谢谢!

3 个答案:

答案 0 :(得分:0)

db.collection_name.aggregate([
    {$sort : {"data.fields.value" : 1}}
])

将按升序对结果进行排序。

如果您希望按降序对集合进行排序,则可以将1替换为-1

答案 1 :(得分:0)

您已嵌套子文档。为了将嵌套的子文档排序到该特定文档。

<?xml version="1.0" encoding="UTF-8"?>
<SplitOrder>
    <Header Info="Some Info" Info2="More Info" Info3="More Info">
    <Order Number="1" Date="1/23/2018 10:53:00 AM">
        <OrderCharges Charge="0.00000"/>
    </Order>
    </Header>
</SplitOrder>

答案 2 :(得分:0)

您可以在3.4中尝试以下聚合。

我们的想法是将字段与字段匹配。以下查询中的location

$addFields将计算文档保留为文档中的额外字段,然后对文档中的值字段进行$sort排序。

$objectToArray将字段内的字段对象转换为$filter内的键值对数组,其中$and$in匹配,以匹配键(字段)和值(位置)

$project,排除了删除排序文档以获取包含原始字段的文档。

$arrayElemAt将数组转换为单个文档。

db.col.aggregate([
  {"$addFields":{
    "mfield":{
      "$arrayElemAt":{
        "$filter":{
          "input":{"$arrayElemAt":["$data.fields",0]},
          "as":"field",
          "cond":{
            "$let":{
              "vars":{"fieldkv":{"$objectToArray":"$$field"}},
              "in":{
                "$and":[
                  {"$in":["field", "$$fieldkv.k"]},
                  {"$in":["location", "$$fieldkv.v"]}
                ]
              }
          }
        }
      }
    }
  }},
  {"$sort":{"mfield.value":-1}},
  {"$project":{"mfield":0}}
])