因此,我的架构设计要求我使用嵌入式文档格式。虽然我认识到通过重新设计架构可以使我要问的内容变得更容易,但是当前的设计满足了所有其他要求,所以我尽力使其工作。
考虑以下粗略模式:
{
"_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精神的意见,而不是将此处理推送给客户。对此方法和实施的任何反馈或批评都是最受欢迎的。
感谢阅读。
答案 0 :(得分:0)
您可以使用aggregate
pipeline汇总有关文档的元数据,然后对其进行过滤。
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}}}
])