MongoDb - 如何准确搜索BSON复合密钥?

时间:2012-09-24 09:10:29

标签: mongodb search bson

我有一个存储有关设备信息的集合,如下所示:

/* 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不应该有我在搜索查询中指定的那些属性?

请指教。感谢。

1 个答案:

答案 0 :(得分:3)

不幸的是,我认为您可以将查询结果缩小到最接近无序_id.dimensions和无序_id.metrics,这要求您了解_id子文档字段中的其他可能字段,例如。 startDateendDate

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表示上进行文档匹配。