Javascript Mongo-查找具有特定条件的文档
我有这个文档结构:Javascript Mongo-查找具有特定条件的文档,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我有这个文档结构: { "_id" : ObjectId("598c00090ec35f5dd3dc508a"), "type" : "Wear", "kind" : "Shoes", "brand" : "Free People", "article" : "6718_brown", "grander" : "m", "size" : { "39" : 1, "44" : 0, "45" :
{
"_id" : ObjectId("598c00090ec35f5dd3dc508a"),
"type" : "Wear",
"kind" : "Shoes",
"brand" : "Free People",
"article" : "6718_brown",
"grander" : "m",
"size" : {
"39" : 1,
"44" : 0,
"45" : 6
},
"rsp" : 3400,
"price" : 873,
"createdAt" : ISODate("2017-08-10T06:41:13.294Z"),
"images" : [
"6718_bezhevye_!_1.jpg",
"6718_bezhevye_!_2.jpg",
"6718_bezhevye_!_3.jpg",
"6718_bezhevye_!_4.jpg",
"6718_bezhevye_!_5.jpg"
],
"__v" : 0
}
我需要找到满足以下条件的所有项目:
大小[key1]+大小[key2]+大小[key3]>0。
请帮帮我,我该怎么做?您可以使用点符号计算总和,然后使用$match检查条件:
var key1 = "39";
var key2 = "44";
var key3 = "45";
db.col.aggregate([
{
$addFields: {
sum: {
$add: [ "$size." + key1, "$size." + key2, "$size." + key3 ]
}
}
},
{
$match: {
sum: {
$gt: 0
}
}
}
])
您可以使用mapReduce实现这一点
db.getCollection('products').mapReduce(
function() {
for (var key in this.size)
emit(this._id, this.size[key]);
},
function(key, values) {
return Array.sum(values);
},
{
out: 'size_sum'
}
)
然后得到结果
db.getCollection('size_sum').find({
value: {
$gt: 0
}
})
您可以使用objectToArray和sum
db.getCollection('collection').aggregate([
{ $project: { item: 1, sizes: { $objectToArray: "$size" }}},
{ $project:{count: { $sum: '$sizes.v' }}},
{ $match: { count: {$gt: 0}}}
])
你能分享你尝试过的吗?没有想法。我不知道如何在混合类型字段中使用$sum和$elemMatch。这很好,但如果我有很多项,有不同的键。@Juff,我想你可以很容易地在JavaScript中循环生成该行[$size.+key1,$size.+key2,$size.+key3],因为它是一个规则的键数组,例如:keys.mapkey=>$size.+key