0

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

/* 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 不应该有任何其他属性?

请指教。谢谢。

4

1 回答 1

4

不幸的是,我认为最接近您可以将查询结果缩小到无序_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重要。最后一个查询对 的精确 BSON 表示进行文档匹配_id

于 2012-09-24T15:12:25.187 回答