Mongodb从子阵列中提取数据

时间:2014-08-12 14:14:41

标签: mongodb

嗨,我有以下mongodb集合

{
"_id" : ObjectId("53ce993639203f573671d3f5"),
"user_id" : NumberLong(51),
"buses" : [ 
    {
        "slot_id" : NumberLong(50),
        "status" : NumberLong(3),
        "bus_id" : NumberLong(8)
    }, 
    {
        "slot_id" : NumberLong(67),
        "status" : NumberLong(3),
        "bus_id" : NumberLong(12)
    }
]
}

我想拉取bus_id = 8的子数组。 最终结果我希望像这样

{
"_id" : ObjectId("53ce993639203f573671d3f5"),
"user_id" : NumberLong(51),
"buses" : [ 
    {
        "slot_id" : NumberLong(67),
        "status" : NumberLong(3),
        "bus_id" : NumberLong(12)
    }
]
}

当我尝试使用以下查询时

db.collectionname.update({},{$pull: {buses: {bus_id:8}}},{multi: true})

我在控制台中遇到以下错误,

Cannot apply $pull/$pullAll modifier to non-array

任何人都可以建议我如何实现这一点,还需要php mongodb查询。

先谢谢

1 个答案:

答案 0 :(得分:0)

为我的样本文件工作得很好:

> db.bus.findOne()
{
    "_id" : ObjectId("53ce993639203f573671d3f5"),
    "user_id" : NumberLong(51),
    "buses" : [
        {
            "slot_id" : NumberLong(50),
            "status" : NumberLong(3),
            "bus_id" : NumberLong(8)
        },
        {
            "slot_id" : NumberLong(67),
            "status" : NumberLong(3),
            "bus_id" : NumberLong(12)
        }
    ]
}
> db.bus.update({}, { "$pull" : { "buses" : { "bus_id" : 8 } } }, { "multi" : true })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.bus.findOne()
{
    "_id" : ObjectId("53ce993639203f573671d3f5"),
    "user_id" : NumberLong(51),
    "buses" : [
        {
            "slot_id" : NumberLong(67),
            "status" : NumberLong(3),
            "bus_id" : NumberLong(12)
        }
    ]
}

问题的原因是某些buses元素不是数组。查询是什么

> db.bus.find({ "buses.0" : { "$exists" : 0}, "buses" : { "$ne" : [] } })

返回?此查询查找没有数组的第0个元素且数组不为空的文档,因此它应返回buses不是数组的文档。