如果您的查询使用聚合操作符,则解决方案就像使用 $out 一样简单。
我创建了一个名为“tester”的示例集合,其中包含以下记录。
{ "_id" : ObjectId("4fb36bfd3d1c88bfa15103b1"), "name" : "bob", "value" : 5, "state" : "b"}
{ "_id" : ObjectId("4fb36c033d1c88bfa15103b2"), "name" : "bob", "value" : 3, "state" : "a"}
{ "_id" : ObjectId("4fb36c063d1c88bfa15103b3"), "name" : "bob", "value" : 7, "state" : "a"}
{ "_id" : ObjectId("4fb36c0c3d1c88bfa1a03b4"), "name" : "john", "value" : 2, "state" : "a"}
{ "_id" : ObjectId("4fb36c103d1c88bfa5103b5"), "name" : "john", "value" : 4, "state" : "b"}
{ "_id" : ObjectId("4fb36c143d1c88bfa15103b"), "name" : "john", "value" : 8, "state" : "b"}
{ "_id" : ObjectId("4fb36c163d1c88bfa15103a"), "name" : "john", "value" : 6, "state" : "a"}
现在使用聚合操作,我进行分组并使用神奇的运算符"$out"将结果保存到新集合中。
db.tester.aggregate([{$group:{
_id:{name:"$name",state:"$state"},
min:{$min:"$value"},
max:{$max:"$value"},
} },
{$out:"tester_max_min"}
])
基本上,此查询尝试按名称和州进行分组,并查找每个单独组的最小值和最大值,然后将结果保存到名为“tester_max_min”的新集合中。
db.tester_max_min.find()
新创建的集合将包含以下文档:
{ "_id" : { "name" : "john", "state" : "b" }, "min" : 4, "max" : 8 }
{ "_id" : { "name" : "john", "state" : "a" }, "min" : 2, "max" : 6 }
{ "_id" : { "name" : "bob", "state" : "a" }, "min" : 3, "max" : 7 }
{ "_id" : { "name" : "bob", "state" : "b" }, "min" : 5, "max" : 5 }
我仍然需要探索$out的实用性,但它对于任何聚合运算符都非常有效。
.forEach
。如果我能够执行db.result.save(db.docs.find(...))
就太好了,但它会提示“无法保存DBQuery”。 - vorouDBQuery
有.toArray()
方法可以实现我想要的功能。 - voroufunction save_array(arr) { arr.forEach(element => db.result.save(element)); };
- Jesús Sánchez