【问题标题】:Mongo queries to search all the collections of a database (Mongo/PyMongo)Mongo 查询以搜索数据库的所有集合 (Mongo/PyMongo)
【发布时间】:2020-01-02 01:09:33
【问题描述】:

我一直纠结于如何查询db,每个文档的通用数据结构如下:

{
    "_id": {
        "$oid": "5e0983863bcf0dab51f2872b"
    },
    "word": "never",  // get the `word` value for each of below queries
    "wordset_id": "a42b50e85e",
    "meanings": [{
        "id": "1f1bca9d9f",
        "def": "not ever",
        "speech_part": "adverb",
        "synonyms": ["ne'er"]
    }, {
        "id": "d35f973ed0",
        "def": "not at all",
        "speech_part": "adverb"
    }]
}

1) 查询获取所有wordfor speech_part: "adverb" (eg: never,....) //

2)查询以获取所有word 为:word 长度为6speech_part:“副词”

我从 SO 中了解到,要首先搜索整个集合,我必须检索数据库中的所有集合,但是如何编写查询是我卡住的地方

【问题讨论】:

标签: mongodb pymongo


【解决方案1】:
db.collection.find({"meanings.speech_part":"adverb"},{"_id":0, "word":1})

要获取上面特定语音部分的所有单词的数组是查询。

查询的第一部分是过滤谓词,就像在您的场景中匹配speach_part。如果您的匹配列不在另一个对象或数组内的对象中,您可以只写{column_name: "something"}。 由于speech_part 位于数组内部的对象中,因此您必须编写{"parentClumn.key":"something"},在您的情况下为{"meanings.speech_part":"adverb"}

查询的第二部分是投影,您可以在其中定义要在结果中包含哪些列。因此,要仅获取单词列值,请执行 {word:1},以获取更多列,请执行 {word:1, etc:1}。虽然默认情况下 mongodb 项目 _id,所以要从结果中删除 _id 您必须显式设置 {_id:0}

    db.collection.find({
          "meanings.speech_part":"adverb", 
          "$expr": { "$gt": [ { "$strLenCP": "$word" }, 6 ] }
    },{"_id":0, "word":1})

获取长度大于 6 的特定语音部分的所有单词的数组。这是一个有点复杂的查询。您可以查找 $expr 文档。在$expr 中,您可以在列上运行函数并匹配结果。在您的情况下,strLenCP 正在计算您的 word 列值的长度,然后通过 $gt 比较运算符检查它是否大于 6

【讨论】:

  • 所以对于多个条件我可以只放一个逗号和条件?
  • 是的。比如 {word: "something", "wordset_id":"something"}
  • 嘿shahin,如何查询这样的,长度= 6,speech_part=名词和包含ac(任何地方)的单词?
【解决方案2】:

您可以尝试以下查询以获取匹配的行。您将不得不尝试使用 pymongo。

db.getCollection('test-collection').find(
    {
        'meanings.speech_part': 'adverb'
    },
    {
        _id: 0,
        word: 1
    }
);

在此处了解 mongodb 中的预测: https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results

【讨论】:

  • 为什么要有 _id= 0, word: 1 ?任何原因,你能简要解释一下吗
  • 上述查找查询的第一部分是您提供条件匹配的位置。而且,第二个是您指定要获取哪些字段的地方 - 例如当你不想要'_id'或任何其他字段时,你说'0'和值'1'来获得你想要的字段。我提供的答案链接对您很有用。
  • 不错的朋友,谢谢指导链接我一定会通过链接
猜你喜欢
  • 1970-01-01
  • 2016-11-03
  • 2018-08-29
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2021-02-10
相关资源
最近更新 更多