Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongo-查找具有特定条件的文档_Javascript_Mongodb_Mongoose - Fatal编程技术网

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