当前位置: 首页 > 知识库问答 >
问题:

如何访问/读取嵌套的 mongo 字段/元素

林涵映
2023-03-14

在嵌套字段中读取MongoDB更新数据后,我使用
db.users.update({_id:'123'}, { '$set':{"friends.0.emails.0.email":'2222'} });

我如何访问那个元素?(只是子元素而不是整个文档)< br >例如< code > db . users . findone({ _ id:' 123 ' },{ ' $ elem ':" friends . 0 . emails . 0 . email " });

例如:< br >如果它是一个JavaScript对象,它将是< br>db.users["123"]。朋友[0]。电子邮件[0]。email
如果是Python字典,它将是< br > < code > db . users[" 123 "][" friends "][0][" emails "][0][" email "] < br >如果是Ruby哈希,它也将是< br > < code > db . users[" 123 "][" friends "][0][" emails "][0][" email "]

理想情况下,答案应该是一个接受键列表(例如[“friend”,0,“emails”,0”,“email”])并返回该嵌套元素的值(例如2222)的函数。

我是一名计算机科学专业的学生,我是一名全栈开发人员:我的同行、教授、同事或老板都无法回答这个问题。我正在尝试学习mongo,访问元素是我想学习的第一件事。我花了几天时间阅读相关的堆栈溢出问题和有关$filter、$elem、点运算符和 $ 运算符的 Mongo 文档,但似乎没有什么可以解释如何简单地访问嵌套元素。

以下是我发现的一些相关问题,这些问题不是我要找的
MongoDB-如何查询集合中的嵌套项目?
^谈论一系列元素(我只想要1个)
MongoDB嵌套数组查询
^检查数组中数组的成员资格(我只想访问一个elem而不是检查成员资格)
从mongoDB数组中获取特定元素
^使用查询过滤(颜色='红色'),但我不想通过查询过滤,我想检索一个精确唯一的索引(例如第0封电子邮件)
使用mgo
^检索嵌套文档这有点接近,但用户从未发布mongo答案,而是引用了go-ang帖子。它也没有涵盖数组的可能性。

共有2个答案

臧友樵
2023-03-14

两年后,我自己找到了答案。克里斯的答案非常接近,我很感激它用一个例子写得很好,但它没有涵盖嵌套数据,这就是重点。

如果您有一个id为“123”的对象,并且您想要获取< code >那个Object.friends[0]。电子邮件[0]。电子邮件
运行以下命令:

// NOTE this string method does work for EVERY case (see explanation below) 
object = db.document.findOne({ _id: '123' }, {projection:{ "friends.0.emails.0.email": 1 }})
// DONT actually use eval, see `get` from `good-js` on npm for an example of non-eval retrieval
return eval("object.friends.0.emails.0.email")

这对我来说是不直观的,因为因为有$set,我正在寻找一个$get。大多数时候,人们想要得到不止一件事,这就是为什么MongoDB有预测的原因。上面的例子使用正投影(1 表示:仅包含-this),但您也可以使用负投影(使用 0 表示:获取除此内容之外的所有内容)。

我通常不会接受这种回答:如果< code > that object . friends[0]类似于< code > that object[" friends . txt "][0]会怎么样?(这是一个非常有效的JSON/Javascript键。)这会导致< code > " friends . txt . 0 . emails . 0 . email " 崩溃!< br >令我沮丧的是,< br >

  1. MongoDB密钥
    中根本不允许句点
  2. 也不允许以 $ 开头的键
  3. 允许
    使用 UTF-8 中的其他所有内容

这导致一些看起来非常奇怪的可能查询
“我也是一个键,spaces.im 也是一个键:))(@U%@#%(*%)*%#^_%#*@$_”
这是两个由句点分隔的有效键,令我感到不安的是,您可以像往常一样检索它们。

仲皓君
2023-03-14

如果有人对此仍有疑问,解决方案似乎在MongoDB文档中:

基本语法是:

db.document.find({[YOUR SEARCH PARAMETER HERE]},{[THE FIELD(S) YOU WANT RETURNED HERE]}

在文档中,他们列出了一个示例,所以我将其与SQL等价物一起粘贴在这里,这将有助于澄清问题。

这是一组文档和文档结构:

db.inventory.insertMany( [
  { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
  { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
  { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
  { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

这是从“状态=A”的条目中获取字段“项目”和“状态”的查询

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

SQL 等效项为:

SELECT _id, item, status from inventory WHERE status = "A"

将它简化为选择单个条目,而不是选择“status = A”的所有条目,这是微不足道的。

 类似资料:
  • 假设我有几个这样的类: 我想迭代所有包含的子类(不是继承的),并获得嵌套对象树中所有字段的列表。但是,当我使用这样的反射代码时: 在“do somethine here”步骤中,我想访问myField的子字段,但在Field api中没有看到任何直接允许我这样做的内容。我试过: MyField.getDeclaringClass(). getDeclaredFields()- 和 MyField.

  • 我拥有的数据集充满了嵌套字段。例如 的输出给出了 9 列,其中第 4 列 (c4) 有 3 个子字段,c4 的第 1 列有 3 个子字段,依此类推。 格式看起来有点像这样 我想要一个数组数据结构的数组(然后可以展开为单个数组)。 只是为了让数据看起来更清晰: 当然,我可以编写一个解析程序,递归地搜索给定记录的子字段,并生成这种树结构(作为数组数组)。然而,我希望在Spark中有一个更简单、更高效的

  • 问题内容: 我只想获取嵌套字段,但不能,因为它不是叶字段。 我在下面尝试过,但是无法匹配嵌套对象中的每个ID和名称。 结果: 这是我的预期结果: 问题答案: 如果您没有某个查询应以某种方式匹配嵌套字段,则可以这样进行: 如果您还有一个查询,并且想返回 匹配 的 嵌套文档,则 可以这样操作(使用):

  • 问题内容: 假设我有json数据,例如 现在我正在从该json数据访问字段,例如: 如何以最有效的方式从给定的json数据访问第三个字段()? 不起作用 一种可能是我使用for循环构造字符串,然后进行eval评估,但是有没有有效的方法呢? 问题答案: 老实说,我无法理解您的问题。JSON已经结构化了,为什么需要更改结构? 在您的情况下,我将按以下方式访问它: 如果碰巧希望 遍历 数据,则需要: 更

  • 问题内容: 我是python的新手,需要帮助解决问题: 我有像这样的字典 除了做其他事情,我们还有其他方法可以获取三个价值吗? ? 问题答案: 您可以在每个字典上使用get()。确保已为每个访问添加了“无”检查。

  • 问题内容: 我的应用程序中有一个非常复杂的数据结构,需要对其进行操作。我试图跟踪玩家在他们的花园中有多少种错误。有十种错误,每种错误都有十种模式,每种模式都有十种颜色。所以可能有1000个独特的错误,我想追踪玩家每种类型的错误数量。嵌套的字典如下所示: 我没有使用此语法的任何错误或投诉。 当我想增加播放器的错误收集时,请执行以下操作: 我收到此错误: 字符串不能转换为’DictionaryInde