使用 pymongo 在 Django 中通过嵌套对象键范围查询 MongoDB 以获取具有跳过/限制的嵌套数组

纱丽顿

我正在用 pymongo 学习 Django。

我有一个 MongoDB 集合,我在其中存储了一些单词以及它们在一些书中的逐年出现次数。

文档以以下格式存储在 MongoDB 中:

{
   "_id":{
      "$oid":"625c51eec27c99b793074501"
   },
   "word":"entropy",
   "occurrence":13,
   "year":{
      "1942":[
         {
            "book":{
               "$oid":"625c51eec27c99b7930744f9"
            },
            "number":8,
            "sentence":[
               1,
               288,
               322,
               1237,
               2570,
               2585,
               2617,
               2634
            ]
         }
      ],
      "1947":[
         {
            "book":{
               "$oid":"625c5280c27c99b793077042"
            },
            "number":5,
            "sentence":[
               377,
               2108,
               2771,
               3467,
               3502
            ]
         }
      ]
   }
}

现在我想获取_id和特定年份范围查询的带有跳过限制(以及相应的书 ID)的句子列表。

例如,

  1. 我想获取一个数组,其中每一行都是包含“年份”、“书”和“句子”的字典。
  2. 该数组将通过_id年份范围进行查询。
  3. 句子列表上应用跳过限制

这是使用 Django 和 pymongo 的可能任务吗?如果是,最快的方法是什么?

到目前为止,我已经这样做了:

search= {'$and': [{"_id": word_id_obj, "year.1942": {"$exists": 1}}]}
datalist= []
word_docs= wordcollec.find(search, {'year': 1, '_id': 0}).skip(1).limit(5)
sentlist['recordsFiltered']+= wordcollec.count_documents(search)

for b in word_docs:
    year_data= b['year'][1942]
    for by in year_data:
        i= i+1
        this_word= {'serial': i, 'year': cyear, 'book': str(by['book'])}
        datalist.append(this_word)

但显然,它没有给出预期的结果,因为跳过限制被应用于根文档对象。年份有固定值,没有范围。

似乎使用 '$slice' 是一种选择。但我无法弄清楚。

感谢您阅读本文。如果你能发出一些光,还有更多。

rickhg12hs

这是一种方法:

...获取一个数组,其中每一行将是一个包含“年份”、“书”和“句子”的字典。

db.collection.aggregate([
  { "$set": { "designWorkAround": { "$objectToArray": "$year" } } },
  { "$set": {
      "designWorkAround": {
        "$map": {
          "input": "$designWorkAround",
          "as": "yearArray",
          "in": {
            "year": "$$yearArray.k",
            "books": {
              "$map": {
                "input": "$$yearArray.v",
                "as": "bookArray",
                "in": {
                  "bookId": "$$bookArray.book",
                  "number": "$$bookArray.number",
                  "sentence": "$$bookArray.sentence"
                }
              }
            }
          }
        }
      }
    }
  },
  { "$unwind": "$designWorkAround" },
  { "$unwind": "$designWorkAround.books" },
  { "$project": {
      "_id": 0,
      "year": "$designWorkAround.year",
      "book": "$designWorkAround.books.bookId",
      "sentence": "$designWorkAround.books.sentence"
    }
  }
])

mongoplayground.net上试试。

我不知道您可能想要的所有数据生成或查询,但我可能会重新设计集合,并且每本书都有一个文档,其中包含文档中的所有相关字段。这将使查询、索引等更简单和更有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 python pymongo 查询嵌套文档 mongodb

如何使用pymongo从mongodb获取文件对象?

使用pyMongo在Flask中获取MongoDB数据

使用flask pymongo从嵌套字段中检索mongodb数据

无法使用pymongo查询Mongodb

MongoDB(pymongo)查找并推送到嵌套数组

通过在 Mongodb 中应用条件使用 $find 查询嵌套对象

Mongodb Pymongo为嵌套对象创建索引

如何使用pymongo在mongodb中查询日期?

使用Pymongo / MongoDB迭代游标对象的有效方法

使用Pymongo从Mongodb中获取数据并用作WS

使用pymongo查询mongoDB(对mongo / pymongo来说是全新的)

MongoDB:使用分页查询嵌套数组

使用pymongo将数组插入mongodb

使用 pymongo 在 Mongodb 中查找空记录

如何使用pymongo编辑mongoDB中的数据

使用 pymongo 在 MongoDB 中插入文档

使用 djongo 和 pymongo 建立 django mongodb 连接

MongoDB聚合查询嵌套对象中的嵌套数组

具有多个条件的 MongoDB findOneAndDelete()(在嵌套数组中)

使用pymongo在MongoDB中创建具有父子层次结构的数据库

具有键值数组计数的Mongodb嵌套数组组

使用collection.find()在pymongo中嵌套查询

通过 pymongo 从 mongodb 获取范围内的数据条目

使用MongoDB更新嵌套数组

MongoDB聚合对嵌套数组使用$ elemMatch

MongoDB - 使用 Java 添加嵌套数组

MongoDB-过滤后获取具有嵌套数组大小的文档

使用 ramda 在嵌套数组中查找具有给定 id 的对象,获取除子数组之外的所有属性