Mongodb 查找查询优化
Mongodb find query optimization
我正在编写 migration script
来更新集合的某些字段,比如 collection2
。
在我们的集合中,我们在每个文档中存储具有以下格式的日语日期:
"date" : { "era" : 4, "year" : 25, "month" : 11, "day" : 25 }// i.e `25-11-2014`
现在我正在寻找一种简单的方法来使用 date > 1-10-2014
获取集合中的所有文档,即
date > { "era" : 4, "year" : 25, "month" : 10, "day" : 1 }
代码运行良好,但我觉得它可以优化但不知道如何。
- 使用
forEach
迭代 collection1
并提取其日期
- 检查日期
collection1.date > 1-10-2014
从 collection2
复制一些文档字段并更新它们
db.col1.find({ name: x123 }).forEach(function(doc){
if(hasValidDate(doc.date1)){
db.col2.find({col1_id:doc._id}).forEach(function(doc2){
var copyobj = {doc2.x1, doc2.x2, ...};
db.col2.update({col1_id:doc._id}, copyobj);
});
}
});
function hasValidDate(date){
return (date.era == 4 && date.year >= 26 &&
(date.month >= 10 && date.day >= 1))?true:false;
}
您可以尝试在 find()
查询中包含实际日期过滤:
db.col1.find(
{
"name": "x123",
"date.era": 4,
"date.year": { "$gte": 26 },
"date.month": { "$gte": 10 },
"date.day": { "$gte": 1 },
}
).forEach(function(doc){
var copyobj = { "$set": {"x1": "1", "x2": "3", ...} };
db.col2.update({_id: doc._id}, copyobj);
});
我正在编写 migration script
来更新集合的某些字段,比如 collection2
。
在我们的集合中,我们在每个文档中存储具有以下格式的日语日期:
"date" : { "era" : 4, "year" : 25, "month" : 11, "day" : 25 }// i.e `25-11-2014`
现在我正在寻找一种简单的方法来使用 date > 1-10-2014
获取集合中的所有文档,即
date > { "era" : 4, "year" : 25, "month" : 10, "day" : 1 }
代码运行良好,但我觉得它可以优化但不知道如何。
- 使用
forEach
迭代collection1
并提取其日期 - 检查日期
collection1.date > 1-10-2014
从
collection2
复制一些文档字段并更新它们db.col1.find({ name: x123 }).forEach(function(doc){ if(hasValidDate(doc.date1)){ db.col2.find({col1_id:doc._id}).forEach(function(doc2){ var copyobj = {doc2.x1, doc2.x2, ...}; db.col2.update({col1_id:doc._id}, copyobj); }); } }); function hasValidDate(date){ return (date.era == 4 && date.year >= 26 && (date.month >= 10 && date.day >= 1))?true:false; }
您可以尝试在 find()
查询中包含实际日期过滤:
db.col1.find(
{
"name": "x123",
"date.era": 4,
"date.year": { "$gte": 26 },
"date.month": { "$gte": 10 },
"date.day": { "$gte": 1 },
}
).forEach(function(doc){
var copyobj = { "$set": {"x1": "1", "x2": "3", ...} };
db.col2.update({_id: doc._id}, copyobj);
});