我希望将一组文档分组,然后将它们格式化为我可以动态查询的内容,然后查询生成的集合。我已经能够使用db.collection.group()
对集合进行分组并对其进行成功格式化,但是在分片方面存在一些限制,这会阻止我在生产中使用它。
以下代码:
var reduceFunction = function(current, result){
var provider = current.provider;
var collection = current.collection || provider;
result[provider] = result[provider] || {};
result[provider][collection] = result[provider][collection] || {};
result[provider][collection] = current.attributes;
}
var result = db.identity.group( {
key: { cookie: 1 },
cond: { organizationId: organization },
reduce: reduceFunction,
initial: {}
} );
以下是输入文档的示例:
{
"_id" : ObjectId("566c92712ae892aeb5278467"),
"provider" : "myProvider",
"collection": "myCollection",
"ip" : 111.111.111.111,
"cookie" : "12381902348asdf",
"updated" : ISODate("2015-12-12T21:32:33.824Z"),
"attributes" : {
company: "My Company"
}
}
这是我想要的输出(按cookie分组的多个输入文档)
{
"cookie" : "12381902348asdf",
"myProvider": {
"myCollection": {
"company": "myCompany"
}
},
"myOtherProvider": {
"myOtherCollection": {
"company": "myCompany"
}
}
}
这样我可以使用类似
的方式进行查询collection.identity.find({"myProvider.myCollection.company": {$regex: /my/}})
这使我可以拥有多个提供者/集合/字段分组的条件,而不会在字段名称中出现冲突。