Mongodb嵌套对象数组查询
mongodb nested object array query
我知道这个问题已经问过无数次了,但我找不到我的确切场景,所以我们开始:
我的数据是这样的:
{
"_id" : ObjectId("55bf22a73d64bd3c495adf3d"),
"_data_type" : "questionnaire",
"title" : "Food quality",
"_namespace" : "questionnaire",
"description" : "tell us your opinion",
"created_time" : ISODate("2015-08-03T08:13:27.874Z"),
"questions" : {
"sub_id_1" : {
"o2" : "Bad",
"o1" : "Good",
"_namespace" : "questionnaire::question",
"question" : "How do you rate our food quality"
},
"sub_id_2" : {
"o2" : "Bad",
"o1" : "Good",
"_namespace" : "questionnaire::question",
"question" : "How do you rate the colouring of our dishes "
},
"sub_id_3" : {
"o2" : "I don't care!",
"o1" : "It is greate",
"_namespace" : "questionnaire::question",
"question" : "How do you like our couches"
}
},
"updated_time" : ISODate("2015-08-03T08:20:37.982Z")
}
我想要得到所有含有"o2"等于"Bad"的问题。
我试了以下方法,但没有成功。
> db.questionnaire.find({"questions.$.o2": "Bad"})
> db.questionnaire.find({"questions.o2": "Bad"})
对于当前的文档结构,您需要使用 $where
操作符,该操作符执行JavaScript求值。
db.collection.find(function(){
for (var key in this.questions) {
if (this.questions[key]["o2"] == "Bad")
return true;
}
})
但是我建议你改变你的文档结构,因为通常你不想使用 $where
。要做到这一点,你需要使用 Bulk()
Api。
var bulk = db.collection.initializeUnorderedBulkOp();
var questions = [];
var subdoc = {};
var count = 0;
db.collection.find().forEach(function(doc) {
for (var key in doc.questions) {
subdoc["o2"] = doc.questions[key]["o2"];
subdoc["o1"] = doc.questions[key]["o1"];
subdoc["_namespace"] = doc.questions[key]["_namespace"];
subdoc["question"] = doc.questions[key]["question"];
subdoc["id"] = key;
questions.push(subdoc);
subdoc = {};
}
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "questions": questions }});
count++;
if (count % 1000 == 0) {
// Execute per 1000 operations and re-init.
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up queues
if ( count % 1000 != 0 ) {
bulk.execute();
}
然后你的文档看起来像这样:
> db.collection.find().pretty()
{
"_id" : ObjectId("55bf22a73d64bd3c495adf3d"),
"_data_type" : "questionnaire",
"title" : "Food quality",
"_namespace" : "questionnaire",
"description" : "tell us your opinion",
"created_time" : ISODate("2015-08-03T08:13:27.874Z"),
"questions" : [
{
"o2" : "Bad",
"o1" : "Good",
"_namespace" : "questionnaire::question",
"question" : "How do you rate our food quality",
"id" : "sub_id_1"
},
{
"o2" : "Bad",
"o1" : "Good",
"_namespace" : "questionnaire::question",
"question" : "How do you rate the colouring of our dishes ",
"id" : "sub_id_2"
},
{
"o2" : "I don't care!",
"o1" : "It is greate",
"_namespace" : "questionnaire::question",
"question" : "How do you like our couches",
"id" : "sub_id_3"
}
],
"updated_time" : ISODate("2015-08-03T08:20:37.982Z")
}
您的查询变得更简单,如果有的话可以使用索引。
db.collection.find({ "questions.o2": "Bad" })
相关文章:
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- MongoDB嵌套对象数组后查询
- jQuery对象从html表中查询为两个一维数组,用于Chartist图表
- 使用查询将对象数组发布到asp.net-mvc控制器操作的正确方法是什么
- 数组数据排序类似mysql查询
- 基于其他属性查询多维数组属性
- 解析查询查找方法返回对象而不是数组
- angularjs $resource将查询资源列表转换为对象数组
- Jquery数组查询不起作用
- 使用Undercore.js查询数组
- JQuery的PHP查询数组变量
- 通过将$resource查询数组添加到AngularJS中另一个数组的底部来进行分页加载
- 如何查询数组中的元素
- MongoDB:查询数组上的浮点数范围
- 解析云查询数组包含值
- PHP 查询数组到 Javascript Google Maps 迭代器
- 在mongodb中使用Node js查询数组项
- 我们如何在mongodb的node js中查询数组元素
- 查询数组 JavaScript
- 在MongoDB中查询数组中的数组;更新如果存在,插入如果为空