我希望有人能帮忙。
我接手了一个使用 Atlas Mongo DB 的项目。项目要求我从一个集合中获取数据。假设集合中的文档结构如下:
{ _id: 'Parent1', kids: [ { _id: 'Test1', grandkids: [ { name: 'Blah' } ] } ] },
{ _id: 'Parent2', kids: [ { _id: 'Test1', grandkids: [ { name: 'Bloh' } ] } ] },
{ _id: 'Parent3', kids: [ { _id: 'Test2', grandkids: [ { name: 'Bloh' } ] } ] }
当孩子的 _id 为“Test 1”时,我需要获取名字为“Bloh”的孙子,这应该返回来自第二个文档的数据。
使用 Cloud MongoDb Web UI,我尝试进行如下查询,只是想看看是否可以找回第二个文档:
{
'$and': [
{ 'kids._id': ObjectId('Test 1') },
{ 'kids.grandkids.name': 'Bloh' }
]
}
但我没有得到任何结果。我怀疑可能是因为 kids 中的 _id 不唯一。
假设我可以拿回第二份文件,我该如何拿回匹配的孙子呢?
提前致谢!
编辑:
使用 MongoDb 游乐场,这可能是一个问题:
无效查询:
第 3 行:无效的 ObjectId:哈希值必须为 24 个字符长
不幸的是,kid._id 不仅重复,而且长度也不总是 24 个字符。
写作
嗯,在你的例子中,
ObjectId('Test 1')
是无效的,但在你的文档中,它只是_id: 'Test1'
一个字符串,所以没问题。如果你在实际数据中使用了 ObjectIds,那么在下面的查询中,将这两种情况都替换为 ObejctId。用于
$elemMatch
确保两个条件kids._id
都kids.grandkids.name
属于kids 数组中的同一个孩子:蒙戈游乐场
在您的查询中,如果它是这样的(不是 ObjectId),那么
kids._id
和kids.grandkids.name
不必属于kids 数组中的同一个kid'Test 1'
对象。此外,您还需要在 后面加上一个空格,而不是'Test1'
:这段代码虽然有效,但实际上是错误的。看看“父母 4”出现的额外匹配(我添加了一些数据),这个额外的匹配是错误的。它匹配的是
_id
第一个孙辈的 和name
第二个孙辈的 。即使将其缩短为等效的术语,也会$and
产生同样的错误结果: