因此,我的架构设计要求我使用嵌入式文档格式。 虽然我认识到通过重新设计架构可以更容易地提出我要问的问题,但当前的设计满足了所有其他要求,所以我正在尽最大努力使其工作。
请考虑以下基本架构:
{
"_id" : "01234ABCD,
"type" : "thing",
"resources" : {
foo : [
{
"herp" : "derp",
},
],
bar : [
{
"herp" : "derp",
},
{
"derp" : "herp"
}
]
},
}
显然,与"资源"键对应的值是嵌入的文档。 我希望能够有效地计算该文档中的键计数,并根据对该值的测试得出结果。 重要的是要注意,嵌入式文档的长度和内容是一个未知的数量 - 因此我希望能够查询这个元。 作为一个彻头彻尾的js白痴,我设法拼凑了以下查询。 例如,如果我要在"资源"文档中查找具有 3 个以上键的文档:
db.coll.find({$where: function(){
var total = 0;
for(i in this['resources']){
++total;
if(total > 3){
return true;
}
}
}})
由于我对 Mongo 很陌生,而且在 js 方面很糟糕,我觉得可能有更聪明的方法可以做到这一点。 我也很好奇听到关于这是否违背了Mongo精神的意见,因为没有将此处理推送给客户。 非常欢迎对这种方法和实施的任何反馈或批评。
感谢您的阅读。
aggregate
管道来组合有关文档的元数据,然后对其进行筛选。
db.coll.aggregate([
{$project: {
// Compute a total count of the keys in the resources docs
keys: {$add: [{$size: '$resources.foo'}, {$size: '$resources.bar'}]},
// Project the original doc
doc: '$$ROOT'
}},
// Only include the docs that have more than 3 keys
{$match: {keys: {$gt: 3}}}
])