我有一份文件 -
{"_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"})
之类的东西会给我所有文件,其中任何子字段的值都是“必需的”
答案 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;
}
}
这有帮助吗?
干杯
罗纳德