MongoDB:如果值按特定顺序存在,则从json数组获取数据

时间:2016-10-26 03:29:10

标签: python mongodb pymongo

我正在使用pymongo。我的馆藏中的文档看起来像这样。

{
  train_name: <Train1>
  train_number: <#>
  details: [
      {
        station_name: <station1>
        arrives: <time>
        departs: <time>
        distance_travelled: <distance>
        halt: <>
      }

     {
        station_name: <station2>
        arrives: <time>
        departs: <time>
        distance_travelled: <distance>
        halt: <>
      }

    {
        station_name: <station3>
        arrives: <time>
        departs: <time>
        distance_travelled: <distance>
        halt: <>
      }

   ]

我想查询这个数据库,找到两个站之间的可用列车。也就是说,用户将提供“源”站和“目的站”,我需要一个查询来返回“源”和“目的地”之间的所有可用列车

从这个示例文档中,如果用户提供:

,我应该将结果显示为“Train1”
  1. 来源 - “station1”
    目的地 - “station2”
  2. 来源 - “station1”
    目的地 - “station3”
  3. 如果用户提供了

    'Train1',则不应该返回:

    1. 来源 - “station2”
      目的地 - “station1”
    2. 来源 - “station3”
      目的地 - “station1”
    3. 因此,简而言之,只有当json列表中的值按特定顺序出现时,我才想查询和获取结果。

      到目前为止,我有这个

      cursor = db.trains.find({"detail.station_name": {"$all": [source, destination]}},
                                      {"train_name": True, "train_no": True, "_id": False})
      

      但它不尊重秩序。它给了我所有列有'源'和'目的地'的火车名称,而不管它们的顺序如何。

      我希望我对自己的问题很清楚。我是mongodb的新手。所以任何帮助将不胜感激。

      感谢。

1 个答案:

答案 0 :(得分:3)

  

所以数据是'详细'列表已经在正确的oder中排序。

如果details值已按正确顺序排序,您可以使用以下方式查询:

db.trains.find( 
          {$and:[
            {"details.0.station_name":"station1"},         
            {"details.station_name":"station2"}
          ]}, 
          {"train_name":1, train_number:1, _id:0}
);

您正在搜索“查找第一个电台名称为station1且所有其他电台包含station2”的所有列车。

如上所述,根据您的用例/应用程序处理数组索引可能并不总是理想的。即除了第一个订单号之外,您并不总是知道订购号。

  

我不知道如何将文档架构更改为指示的方向。您可以详细说明一下

您可以使用各种data modeling来利用和优化常用查询。作为领域专家,您是做出此决定的最佳人选。 但是,以下是替代示例:

您可以为sourceStationdestinationStation添加一个字段,以便轻松查询开始/结束电台:

{
    sourceStation: {
        id: 001,
        name: "station1"
    },
    destinationStation:{
        id: 010,
        name: "station3"
    },
    details: [
      { station_name: "station1",
        ... },
      { station_name: "station2",
        ... },
      { station_name: "station3",
        ...}
    ],
    train_name: "Train1", 
    train_no: 88,
    arrives: <time>, 
    departs: <time>, 
    distance_travelled: <distance>
}

或者您可以将旅程中断为单独的文件,以便进行粒度旅行:

 
{
    _id: ObjectId(...),
    sourceStation: {
        id: 001,
        name: "station1"
    },
    destinationStation:{
        id: 009,
        name: "station2"
    },
    train_name: "Train1", 
    train_no: 88,
    arrives: "0900", 
    departs: "0910", 
    distance_travelled: "3kms"
}, 

{
    _id: ObjectId(...),
    sourceStation: {
        id: 009,
        name: "station2"
    },
    destinationStation:{
        id: 010,
        name: "station3"
    },
    train_name: "Train1", 
    train_no: 88,
    arrives: "0930", 
    departs: "0940", 
    distance_travelled: "4kms"
}

有关更多灵感,另请参阅Data Model Examples and Patterns

  

我是mongodb的新手。所以任何帮助都将不胜感激。

我建议您在MongoDB University注册免费在线课程。特别是M101开发人员课程,涵盖架构设计和查询。