【发布时间】:2018-01-06 17:42:15
【问题描述】:
我的 mongodb 集合中有以下文档:
{'name' : 'abc-1','parent':'abc', 'price': 10}
{'name' : 'abc-2','parent':'abc', 'price': 5}
{'name' : 'abc-3','parent':'abc', 'price': 9}
{'name' : 'abc-4','parent':'abc', 'price': 11}
{'name' : 'efg', 'parent':'', 'price': 10}
{'name' : 'efg-1','parent':'efg', 'price': 5}
{'name' : 'abc-2','parent':'efg','price': 9}
{'name' : 'abc-3','parent':'efg','price': 11}
我想执行以下操作:
a. Group By distinct parent
b. Sort all the groups based on price
c. For each group select a document with minimum price
i. check each record's parent sku exists as a record in name field
ii. If the name exists, do nothing
iii. If the record does not exists, insert a document with parent as empty and other values as the value of the record selected previously (minimum value).
我厌倦了按如下方式使用:
db.file.find().sort([("price", 1)]).forEach(function(doc){
cnt = db.file.count({"sku": {"$eq": doc.parent}});
if (cnt < 1){
newdoc = doc;
newdoc.name = doc.parent;
newdoc.parent = "";
delete newdoc["_id"];
db.file.insertOne(newdoc);
}
});
它的问题是它需要太多时间。这里有什么问题?如何优化?聚合管道会是一个很好的解决方案,如果是的话怎么做?
【问题讨论】:
-
你有多少条记录?您的
price和sku字段是否已编入索引? -
1- 将
name用作真实的_id('_id'=name),2-whole_DB = db.file.find()而不是whole_DB.forEach(..............)为什么要扫描整个数据库两次? 3-db.file.find() != db.file.aggregate(......)所以所有数据库条目都不是搜索结果。 4-db['PA'].aggregate(...............)意思是P = product,A= product_name _first letter使用collections来避免创建一个大的哈希文件。 -
@GarbageCollector 我无法索引它们,因为集合将是动态的,我需要动态创建它们、搜索它们、导出集合并删除集合。