mongodb 通过子json字段过滤mongo数据(mongosh)

tcbh2hod  于 2023-01-20  发布在  Go
关注(0)|答案(1)|浏览(217)

假设我有一个mongo集合,如下所示:

{
_id: ...,
timestamp: '',
SomeStuff: {},
OriginalData: '{
    "name": "Bob",
    "age": 23,
'}
}

这表示此集合中的单个记录。OriginalData字段中的所有内容都由转换为字符串的源JSON对象填充。其他所有内容都是一些标准化流程自动插入的内容(并且可以安全地假设始终存在)
有没有可能以一种我可以在OriginalData中的子字段上操作的方式来过滤这个集合?
比如:

# Find all the records with people who are 20 years or older
mongosh> col.find({'OriginalData.age': {$gte: 20}})

我希望基于数字子字段进行过滤,同时考虑到一些originalData字段可能不提供age字段。

0lvr5msh

0lvr5msh1#

你应该通过将其保存为文档而不是字符串来解决这个问题。但是,同时你可以使用$function将其转换为文档,然后过滤它。

db.col.aggregate([
  {
    $addFields: {
      newField: {
        $function:{
          body: function(OriginalData) {  //js function that parses the string and returns document
            return JSON.parse(OriginalData)
          },
          args: ["$OriginalData"],    //string field is the argument to the js function
          lang: "js"
        }
      }
    }
  },
  {
    $match: {"newField.age": {$gte: 20}}
  }
])

相关问题