我正在尝试在mongo中查询一个像这样结构化的集合......
{
"type":"apple"
"quality": {
"1": {
"owner":"Dan",
"age":28
},
"2": {
"owner":"Joe",
"age":21
}
"3": {
"owner":"Bob",
"age":29
}
}
}
我最初尝试findOne({"quality.owner":"Dan"})
但是失败了。然后我意识到需要像findOne({"quality.1.owner":"Dan"})
那样完成...而不是我想要的。
有没有用通配符代替1
或以我想要的方式执行查询?我不知道质量对象中的所有变量是什么,所以我认为我不能做“子对象”匹配= /
编辑:
不幸的是,重新格式化这些数据对于项目是不可能的,因为第三方API正在检索数据,而这些索引号代表“放置”(第一名,第二名......)
答案 0 :(得分:3)
使用您当前的架构,您无法查询(findOne({"quality.owner":"Dan"})
)。使用嵌入式文档,您只能使用dot notation进行搜索。
但您可以将当前架构重新设计为:
{
"type":"apple"
"quality": [
{
number: 1,
"owner":"Dan",
"age":28
},
{
number: 2,
"owner":"Joe",
"age":21
}]
}
}
然后使用点表示法搜索:
findOne({"quality.owner":"Dan"})
答案 1 :(得分:-1)
如果您可以重新配置文档以使用数组而不是子文档来代替quality
字段,那么您可以按照自己的意愿进行查询。此外,您可以efficiently index array member fields or the whole array(即子文档本身):
db.collection.ensureIndex({"quality.owner": 1})
db.collection.findOne({"quality.owner": "Dan"})
如果转换为使用数组,则可以使用the $
positional operator对数组元素及其成员执行更新:
db.collection.update({"quality.owner": "Dan"}, {$set: {"quality.$.age": 27}})