Mongo查询子域

时间:2013-03-07 09:57:18

标签: mongodb

我有一份文件 -

  {"_id" : ObjectId("51385d2308d427ce306f0100"),
  "aid" : "1",
  "studyId" : "study-1",
  "mediaType" : "microBlog",
  "text" : "bla bla",
  "sentences" : "bla bla",
  "status" : {
          "algo1" : "required",
          "algo2" : "required",
          "algo3" : "completed",
          "algo4" : "completed"
  },
  "priority" : "u"}

状态字段包含多个具有不同状态值的子字段。是否可以创建一个查询,使其返回任何状态子字段值为“必需”的所有文档?

db.foo.find({status : "required"})之类的东西会给我所有文件,其中任何子字段的值都是“必需的”

3 个答案:

答案 0 :(得分:5)

另一种更有效的方法是将“状态”子文档实现为“类型化值”数组,如下所示:

 {"_id" : ObjectId("51385d2308d427ce306f0100"),
  "aid" : "1",
  "studyId" : "study-1",
  "mediaType" : "microBlog",
  "text" : "bla bla",
  "sentences" : "bla bla",
  "status" : [
          { type: "algo1", value: "required" },
          { type: "algo2", value: "required" },
          { type: "algo3", value: "completed" },
          { type: "algo4", value: "completed" }
  ],
  "priority" : "u"}

这将允许您使用此查询查找任何子字段具有“必需”值的所有文档:

db.foo.find({"status.value":"required"})

在此子字段上定义索引会加快查询速度:

db.foo.ensureIndex({"status.value":1})

答案 1 :(得分:0)

您可以通过db.foo.find({ 'status.algo1' : 'required' })db.foo.find({ 'status.algo2' : 'required' })进行搜索,但可能无法按正则表达式keys进行过滤,另请参阅此帖子:https://stackoverflow.com/a/7290728/654952

答案 2 :(得分:0)

你可以使用mapReduce() map()函数包含的内容如下:

// loop all key/value pairs in status without knowing its key
for ( item in this.status ) {
    // if value is required: emit the data and break the loop
    if ( this.status[item] == "required" ) {
        emit( ... )
        break;
    }
}

这有帮助吗?

干杯

罗纳德