我有一个存储有关设备信息的集合,如下所示:
/* 1 */
{
"_id" : {
"startDate" : "2012-12-20",
"endDate" : "2012-12-30",
"dimensions" : ["manufacturer", "model"],
"metrics" : ["deviceCount"]
},
"data" : {
"results" : "1"
}
}
/* 2 */
{
"_id" : {
"startDate" : "2012-12-20",
"endDate" : "2012-12-30",
"dimensions" : ["manufacturer", "model"],
"metrics" : ["deviceCount", "noOfUsers"]
},
"data" : {
"results" : "2"
}
}
/* 3 */
{
"_id" : {
"dimensions" : ["manufacturer", "model"],
"metrics" : ["deviceCount", "noOfUsers"]
},
"data" : {
"results" : "3"
}
}
我正在尝试使用_id字段查询文档,这将是唯一的。我遇到的问题是,当我查询所有不同的属性时,如:
db.collection.find({$and: [{"_id.dimensions":{ $all: ["manufacturer","model"], $size: 2}}, {"_id.metrics": { $all:["noOfUsers","deviceCount"], $size: 2}}]});
这匹配2和3个文档(我不关心属性值的顺序),但我想只回3。我怎么能说_id不应该有我在搜索查询中指定的那些属性?
请指教。感谢。
答案 0 :(得分:3)
不幸的是,我认为您可以将查询结果缩小到最接近无序_id.dimensions
和无序_id.metrics
,这要求您了解_id
子文档字段中的其他可能字段,例如。 startDate
和endDate
。
db.collection.find({$and: [
{"_id.dimensions":{ $all: ["manufacturer","model"], $size: 2}},
{"_id.metrics": { $all:["noOfUsers","deviceCount"], $size: 2}},
{"_id.startDate":{$exists:false}},
{"_id.endDate":{$exists:false}}
]});
如果您不知道_id
中可能的字段集,那么另一种可能的解决方案是指定您想要的确切_id
,例如。
db.collection.find({"_id" : {
"dimensions" : ["manufacturer", "model"],
"metrics" : ["deviceCount", "noOfUsers"]
}})
但这意味着_id.dimensions
和_id.metrics
的顺序非常重要。最后一个查询在_id
的确切BSON表示上进行文档匹配。