Mongodb 如果子数组文档不';你不满足比赛条件吗?

Mongodb 如果子数组文档不';你不满足比赛条件吗?,mongodb,mongoose,Mongodb,Mongoose,如果子数组文档不满足Mongoose中的匹配条件,Mongoose不会返回对象 MongoDB查询: { _id: "abcdefg", fruitId: "kipld", isActive: true, types :[ { name: "Kashmir Apple", price: 90, isActive: false }, {

如果子数组文档不满足Mongoose中的匹配条件,Mongoose不会返回对象

MongoDB查询:

{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[
        {
            name: "Kashmir Apple",
            price: 90,
            isActive: false
        },
        {
            name: "American Apple",
            price: 120,
            isActive: false
        }
    ]
}
{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[]
}
{
        "_id" : "abcdefg",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kashmir Apple",
                        "price" : 90,
                        "isActive" : false
                },
                {
                        "name" : "American Apple",
                        "price" : 120,
                        "isActive" : false
                }
        ]
}
{
        "_id" : "uvwxyz",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kinnaur Apple",
                        "price" : 80,
                        "isActive" : false
                },
                {
                        "name" : "Shimla Apple",
                        "price" : 70,
                        "isActive" : true
                }
        ]
}
db.fruits.aggregate([
  { $match: { "isActive": true, fruitId: "kipld" } },
  { $project: { _id: 1, fruitId: 1, isActive: 1, 
                result_types: { $filter: {
                                   input: "$types",
                                      as: "type",
                                    cond: { $eq: [ "$$type.isActive", true ] }
                                 } 
                             } } 
   }
])
db.fruits.aggregate(
{$match:{“isActive”:true,水果ID:“kipld”},
{$unwind:'$types'},
{$match:{“types.isActive”:true},
{$group:{
_id:“$\u id”,
名称:{$first:'$name'},
价格:{$first:'$price'},
类型:{$push:'$types'}
}
},
{$项目:{
“_id”:1,
“名称”:1,
"价格":1,,
“类型”:1,
}
}
)
MongoDB系列:

{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[
        {
            name: "Kashmir Apple",
            price: 90,
            isActive: false
        },
        {
            name: "American Apple",
            price: 120,
            isActive: false
        }
    ]
}
{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[]
}
{
        "_id" : "abcdefg",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kashmir Apple",
                        "price" : 90,
                        "isActive" : false
                },
                {
                        "name" : "American Apple",
                        "price" : 120,
                        "isActive" : false
                }
        ]
}
{
        "_id" : "uvwxyz",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kinnaur Apple",
                        "price" : 80,
                        "isActive" : false
                },
                {
                        "name" : "Shimla Apple",
                        "price" : 70,
                        "isActive" : true
                }
        ]
}
db.fruits.aggregate([
  { $match: { "isActive": true, fruitId: "kipld" } },
  { $project: { _id: 1, fruitId: 1, isActive: 1, 
                result_types: { $filter: {
                                   input: "$types",
                                      as: "type",
                                    cond: { $eq: [ "$$type.isActive", true ] }
                                 } 
                             } } 
   }
])
预期结果如下:

{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[
        {
            name: "Kashmir Apple",
            price: 90,
            isActive: false
        },
        {
            name: "American Apple",
            price: 120,
            isActive: false
        }
    ]
}
{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[]
}
{
        "_id" : "abcdefg",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kashmir Apple",
                        "price" : 90,
                        "isActive" : false
                },
                {
                        "name" : "American Apple",
                        "price" : 120,
                        "isActive" : false
                }
        ]
}
{
        "_id" : "uvwxyz",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kinnaur Apple",
                        "price" : 80,
                        "isActive" : false
                },
                {
                        "name" : "Shimla Apple",
                        "price" : 70,
                        "isActive" : true
                }
        ]
}
db.fruits.aggregate([
  { $match: { "isActive": true, fruitId: "kipld" } },
  { $project: { _id: 1, fruitId: 1, isActive: 1, 
                result_types: { $filter: {
                                   input: "$types",
                                      as: "type",
                                    cond: { $eq: [ "$$type.isActive", true ] }
                                 } 
                             } } 
   }
])

但是,当我运行上述查询时,我没有得到任何结果。

您可以使用聚合运算符获得所需的结果。这只是过滤所有数组元素并返回具有匹配过滤条件的数组。注意:过滤器应用于每个文档的数组。因此,在您的情况下,不需要使用
$unwind
$group
阶段来获得结果

样品
水果
收集:

{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[
        {
            name: "Kashmir Apple",
            price: 90,
            isActive: false
        },
        {
            name: "American Apple",
            price: 120,
            isActive: false
        }
    ]
}
{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[]
}
{
        "_id" : "abcdefg",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kashmir Apple",
                        "price" : 90,
                        "isActive" : false
                },
                {
                        "name" : "American Apple",
                        "price" : 120,
                        "isActive" : false
                }
        ]
}
{
        "_id" : "uvwxyz",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kinnaur Apple",
                        "price" : 80,
                        "isActive" : false
                },
                {
                        "name" : "Shimla Apple",
                        "price" : 70,
                        "isActive" : true
                }
        ]
}
db.fruits.aggregate([
  { $match: { "isActive": true, fruitId: "kipld" } },
  { $project: { _id: 1, fruitId: 1, isActive: 1, 
                result_types: { $filter: {
                                   input: "$types",
                                      as: "type",
                                    cond: { $eq: [ "$$type.isActive", true ] }
                                 } 
                             } } 
   }
])
聚合查询:

{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[
        {
            name: "Kashmir Apple",
            price: 90,
            isActive: false
        },
        {
            name: "American Apple",
            price: 120,
            isActive: false
        }
    ]
}
{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[]
}
{
        "_id" : "abcdefg",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kashmir Apple",
                        "price" : 90,
                        "isActive" : false
                },
                {
                        "name" : "American Apple",
                        "price" : 120,
                        "isActive" : false
                }
        ]
}
{
        "_id" : "uvwxyz",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kinnaur Apple",
                        "price" : 80,
                        "isActive" : false
                },
                {
                        "name" : "Shimla Apple",
                        "price" : 70,
                        "isActive" : true
                }
        ]
}
db.fruits.aggregate([
  { $match: { "isActive": true, fruitId: "kipld" } },
  { $project: { _id: 1, fruitId: 1, isActive: 1, 
                result_types: { $filter: {
                                   input: "$types",
                                      as: "type",
                                    cond: { $eq: [ "$$type.isActive", true ] }
                                 } 
                             } } 
   }
])
输出:

{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[
        {
            name: "Kashmir Apple",
            price: 90,
            isActive: false
        },
        {
            name: "American Apple",
            price: 120,
            isActive: false
        }
    ]
}
{
    _id: "abcdefg",
    fruitId: "kipld",
    isActive: true,
    types :[]
}
{
        "_id" : "abcdefg",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kashmir Apple",
                        "price" : 90,
                        "isActive" : false
                },
                {
                        "name" : "American Apple",
                        "price" : 120,
                        "isActive" : false
                }
        ]
}
{
        "_id" : "uvwxyz",
        "fruitId" : "kipld",
        "isActive" : true,
        "types" : [
                {
                        "name" : "Kinnaur Apple",
                        "price" : 80,
                        "isActive" : false
                },
                {
                        "name" : "Shimla Apple",
                        "price" : 70,
                        "isActive" : true
                }
        ]
}
db.fruits.aggregate([
  { $match: { "isActive": true, fruitId: "kipld" } },
  { $project: { _id: 1, fruitId: 1, isActive: 1, 
                result_types: { $filter: {
                                   input: "$types",
                                      as: "type",
                                    cond: { $eq: [ "$$type.isActive", true ] }
                                 } 
                             } } 
   }
])
注意“结果类型”空数组,其中对于“类型”数组的所有元素,
types.isActive
值为
false
。结果输出中只有值为
true
的元素

{
        "_id" : "abcdefg",
        "fruitId" : "kipld",
        "isActive" : true,
        "result_types" : [ ]
}
{
        "_id" : "uvwxyz",
        "fruitId" : "kipld",
        "isActive" : true,
        "result_types" : [
                {
                        "name" : "Shimla Apple",
                        "price" : 70,
                        "isActive" : true
                }
        ]
}

您的查询显示
{$match:{“types.isActive”:true}
,但输入文档的
“tyoes.isActive”
值为
false
。因此,未选择任何文档。这是预期的行为。如果不存在
true
记录,我可以这样做以返回
空数组吗?您可以在此处检查:@Rajath You can。但是,您使用的查询管道不是这样的。谢谢,prasad,我用同样的方法实现了它