Mongodb 从mongo获取datetime并将其推送到数组中

Mongodb 从mongo获取datetime并将其推送到数组中,mongodb,pymongo,Mongodb,Pymongo,我有以下道具的文件: { 'published_date': '2020/03/10 07:20:09', 'relationships': [ {'rel_name': 'HAS_REL'}, {'rel_name': 'HAS_NO_REL'}, ] } 我想在关系的每个字段中添加asrel\u name的值has\u rel发布日期的值作为属性dict。文档将如下所示: { 'published_date': '2020/03/10

我有以下道具的文件:

{
   'published_date': '2020/03/10 07:20:09',
   'relationships': [
       {'rel_name': 'HAS_REL'},
       {'rel_name': 'HAS_NO_REL'},
    ]
}
我想在
关系
的每个字段中添加as
rel\u name
的值has\u rel发布日期的值作为属性dict。文档将如下所示:

{
   'published_date': '2020/03/10 07:20:09',
   'relationships': [
       { 'rel_name': 'HAS_REL'
         'date': 2020,03,10,07,20,09
       },
       {'rel_name': 'HAS_NO_REL'},
    ]
}
TEST_COLLECTION.update_one(
    {'_id': ObjectId(document_id)},
    [
        {'$set': {
            'relationships': {
                '$let': {
                    'vars': {
                        'date': { '$dateFromString': { 'dateString': '$published_date', format: "%Y/%m/%d %H:%M:%S" } }
                    },
                    'in': {
                        '$map': {
                            'input': "$relationships",
                            'in': {
                                '$cond': {
                                      'if': { '$eq': ["$$this.rel_name", "HAS_REL"] },
                                      'then': { '$mergeObjects': ["$$this", { 'date': "$$date" }] },
                                      'else': "$$this"
                                   }
                                }
                             }
                          }
                       }
                    }
              }
         }
    ]
)
到目前为止,我的查询如下所示:

TEST_COLLECTION.update_one(
  {'_id': ObjectId(document_id)},
  {'$set': {'relationships.$[elem].date': {'$dateFromString': '$published_date'}}},
  False,
  False,
  None,
  [{'elem.rel_name': 'HAS_RELATIONSHIP'}],
)
但我得到了一个错误:

WriteError: The dollar ($) prefixed field '$dateFromString' in 'parsed.relationships.1.date.$dateFromString' is not valid for storage.
有什么想法吗

更新 使用初始答案,我更新了查询,如下所示:

{
   'published_date': '2020/03/10 07:20:09',
   'relationships': [
       { 'rel_name': 'HAS_REL'
         'date': 2020,03,10,07,20,09
       },
       {'rel_name': 'HAS_NO_REL'},
    ]
}
TEST_COLLECTION.update_one(
    {'_id': ObjectId(document_id)},
    [
        {'$set': {
            'relationships': {
                '$let': {
                    'vars': {
                        'date': { '$dateFromString': { 'dateString': '$published_date', format: "%Y/%m/%d %H:%M:%S" } }
                    },
                    'in': {
                        '$map': {
                            'input': "$relationships",
                            'in': {
                                '$cond': {
                                      'if': { '$eq': ["$$this.rel_name", "HAS_REL"] },
                                      'then': { '$mergeObjects': ["$$this", { 'date': "$$date" }] },
                                      'else': "$$this"
                                   }
                                }
                             }
                          }
                       }
                    }
              }
         }
    ]
)
然而,我似乎没有得到正确的文件:

InvalidDocument:文档必须只有字符串键,键为 内置函数格式

看看

您必须指定
格式
字段,除非使用默认格式
%Y-%m-%dT%H:%m:%S.%LZ“
。将日期/时间值存储为字符串通常是一个设计缺陷

所以,一定是这样

{'$dateFromString': { dateString: '$published_date', format: "%Y/%m/%d %H:%M:%S" } }
注意,时间被视为UTC时间。如果需要,设置字段
时区
,以指定时区

请注意,
$dateFromString()
是一个聚合函数,因此必须使用

TEST_COLLECTION.update_one(
   { '_id': ObjectId(document_id) },
   [
      {
         $set: {
            relationships: {
               $map: {
                  input: "$relationships",
                  in: {
                     $cond: {
                        if: { $eq: ["$$this.rel_name", "HAS_REL"] },
                        then: {
                           $mergeObjects: [
                              "$$this",
                              {
                                 date: {
                                    $dateFromString: {
                                       dateString: '$published_date',
                                       format: "%Y/%m/%d %H:%M:%S"
                                    }
                                 }
                              }
                           ]
                        },
                        else: "$$this"
                     }
                  }
               }
            }
         }
      }
   ]
)
或另一种风格:

TEST_COLLECTION.update_one(
   { '_id': ObjectId(document_id) },
   [
      {
         $set: {
            relationships: {
               $let: {
                  vars: {
                     date: { $dateFromString: { dateString: '$published_date', format: "%Y/%m/%d %H:%M:%S" } }
                  },
                  in: {
                     $map: {
                        input: "$relationships",
                        in: {
                           $cond: {
                              if: { $eq: ["$$this.rel_name", "HAS_REL"] },
                              then: { $mergeObjects: ["$$this", { date: "$$date" }] },
                              else: "$$this"
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   ]
)
看看

您必须指定
格式
字段,除非使用默认格式
%Y-%m-%dT%H:%m:%S.%LZ“
。将日期/时间值存储为字符串通常是一个设计缺陷

所以,一定是这样

{'$dateFromString': { dateString: '$published_date', format: "%Y/%m/%d %H:%M:%S" } }
注意,时间被视为UTC时间。如果需要,设置字段
时区
,以指定时区

请注意,
$dateFromString()
是一个聚合函数,因此必须使用

TEST_COLLECTION.update_one(
   { '_id': ObjectId(document_id) },
   [
      {
         $set: {
            relationships: {
               $map: {
                  input: "$relationships",
                  in: {
                     $cond: {
                        if: { $eq: ["$$this.rel_name", "HAS_REL"] },
                        then: {
                           $mergeObjects: [
                              "$$this",
                              {
                                 date: {
                                    $dateFromString: {
                                       dateString: '$published_date',
                                       format: "%Y/%m/%d %H:%M:%S"
                                    }
                                 }
                              }
                           ]
                        },
                        else: "$$this"
                     }
                  }
               }
            }
         }
      }
   ]
)
或另一种风格:

TEST_COLLECTION.update_one(
   { '_id': ObjectId(document_id) },
   [
      {
         $set: {
            relationships: {
               $let: {
                  vars: {
                     date: { $dateFromString: { dateString: '$published_date', format: "%Y/%m/%d %H:%M:%S" } }
                  },
                  in: {
                     $map: {
                        input: "$relationships",
                        in: {
                           $cond: {
                              if: { $eq: ["$$this.rel_name", "HAS_REL"] },
                              then: { $mergeObjects: ["$$this", { date: "$$date" }] },
                              else: "$$this"
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   ]
)

谢谢@Wernfried的回答。然而,对于pymongo,这似乎不起作用,我已经更新了问题谢谢@Wernfried的回答。然而,对于pymongo,这似乎不起作用,我已经更新了问题try
“格式”:
这样一个愚蠢的错误^^太多的时间编码,谢谢@wernfrieddomschiettry
“格式”:
这样一个愚蠢的错误^太多的时间编码,谢谢@wernfrieddomschiet