我的收藏包含以下两个文件
{
"BornYear": 2000,
"Type": "Zebra",
"Owners": [
{
"Name": "James Bond",
"Phone": "007"
}
]
}
{
"BornYear": 2012,
"Type": "Dog",
"Owners": [
{
"Name": "James Brown",
"Phone": "123"
},
{
"Name": "Sarah Frater",
"Phone": "345"
}
]
}
我想找到所有拥有所有者的动物,这些动物与詹姆斯有关。 我尝试展开Owners数组,但无法访问Name变量。
答案 0 :(得分:4)
您可以使用点表示法来匹配数组元素的字段:
db.test.find({'Owners.Name': /James/})
答案 1 :(得分:2)
这里有点用词不当。要在“集合”中找到“对象”或项目,那么您真正需要做的就是匹配“对象/项目”
db.collection.find({
"Owners.Name": /^James/
})
哪个有效,但当然不会将结果限制为“詹姆斯”的“第一”匹配,这将是:
db.collection.find(
{ "Owners.Name": /^James/ },
{ "Owners.$": 1 }
)
作为基本预测。但这并不仅仅是“单一”匹配,这意味着你需要.aggregate()
方法,而不是这样:
db.collection.aggregate([
// Match the document
{ "$match": {
"Owners.Name": /^James/
}},
// Flatten or de-normalize the array
{ "$unwind": "Owners" },
// Filter th content
{ "$match": {
"Owners.Name": /^James/
}},
// Maybe group it back
{ "$group": {
"_id": "$_id",
"BornYear": { "$first": "$BornYear" },
"Type": { "$first": "$Type" },
"Ownners": { "$push": "$Owners" }
}}
])
在过滤时,它允许子文档数组中的多个匹配。
另一点是正则表达式上的“锚”或“^”插入符号。你真的需要它,你可以在字符串的“开始”进行匹配,正确使用索引。开放式正则表达式操作不能使用索引。