繁体   English   中英

MongoDB查找投影,将元素与$ ne匹配

[英]MongoDB find projection, matching elements with $ne

我有一个查询,返回包含对象数组的对象。 在该对象数组中,有些对象不应该处理。 这是我所拥有的类似对象:

{
    _id: 12345,
    data: [
        {
            state: 1,
            info: "abc"
        },{
            state: 2,
            info: "cde"
        },{
            state: 2,
            info: "efg"
        }
    ]
}

我只想显示状态不等于1的对象。 所以我想找回这样的东西:

{
    _id: 12345,
    data: [
        {
            state: 2,
            info: "cde"
        },{
            state: 2,
            info: "efg"
        }
    ]
}

可能有数百个“主要”对象和数十个“子”对象。 我尝试使用查询:

col.find({'data.info': {$in: [] }, {_id: 1, data: { $elemMatch: { state: {$ne: 1 } } } }, {}, callback);

但这只给了我这个:

{
    _id: 12345,
    data: [
        {
            state: 2,
            info: "cde"
        }
    ]
}

换句话说,$ elemMatch可以完成应做的事情,但是我需要得到不同的结果。 那么,是否有一种方法可以在一个查询中执行此操作,也可以不进行预处理(在进一步的代码读取数据之前删除条目)?

$elemMatch投影运算符仅返回数组中的第一个匹配元素。

为了过滤整个数组,MongoDB 2.2+中最好的方法是使用Aggregation Framework。 或者,您也可以使用Map / Reduce或在您的应用程序代码中执行此操作。

汇总示例:

db.data.aggregate(

    // Initial match to limit number of documents
    { $match : {
        data: { $elemMatch: { state: {$ne: 1 } } }
    }},

    // Convert the data array into a stream of documents
    { $unwind: "$data" },

    // Limit to matching elements of the data array
    { $match : {
        "data.state": {$ne: 1 }
    }},

    // Re-group by original document _id
    { $group: {
        _id: "$_id",
        data: { $push: "$data" }
    }}
)

样本输出:

{
    "_id" : 12345,
    "data" : [
        {
            "state" : 2,
            "info" : "cde"
        },
        {
            "state" : 2,
            "info" : "efg"
        }
    ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM