我有很多这样的收藏品
{
"_id" : 383566,
"horses" : {
"609075" : {
"_id" : 609075,
"name" : "Aghawonan"
},
"634478" : {
"_id" : 634478,
"name" : "French Thyne"
},
"595535" : {
"_id" : 595535,
"name" : "Doctor Hanley"
},
"593718" : {
"_id" : 593718,
"name" : "Ballyhill Boy"
},
"578089" : {
"_id" : 578089,
"name" : "Oh Alabama"
},
"632597" : {
"_id" : 632597,
"name" : "Bowling Alone"
},
"525424" : {
"_id" : 525424,
"name" : "Tally-Ho Duke"
}
}
我需要在数组中找到Horses _id匹配的所有集合
我的版本,但不起作用
db.cards.find({'horses': {$elemMatch: {_id:525424}}})
答案 0 :(得分:1)
在您的示例中,horses
不是数组,而是对象。这个数据结构有点奇怪和多余,因为id都是&name;的一部分。 (或路径,如果你愿意)和实际的文件数据。在您的数据结构中,您可以通过horses.609075.name
引用特定的马,但这通常不是很有帮助。
如果horses
是这样的数组,那么您的查询将起作用:
{
"_id" : 383566,
"horses" : [
{
"_id" : 609075,
"name" : "Aghawonan"
},
{
"_id" : 634478,
"name" : "French Thyne"
},
// ...
]
}
由于您只查询单个属性,因此不需要$elemMatch
。您可以像这样查询:
db.cards.find({"horses._id" : 609075});
请注意,您将收到整张卡片,而不仅仅是阵列的一部分。
作为旁注,为什么马的ids称为_id
?名称_id
仅在根级别是一个特殊字段。嵌入式文档没有任何特殊字段。