MongoDB查找字段中具有多个键的文档

时间:2018-02-04 16:31:18

标签: node.js mongodb mongodb-query aggregation-framework

这就是我的数据集中文档的样子:

{
  username: 'stack',
  attempts: { 1517761701: false, 1512341532: true }
}

{
  username: 'overflow',
  attempts: { 1217563721: false }
}

现在,我想检索数据集中attempts包含多个键的每个文档。因此查询应该返回用户'stack'的文档,而不是用户'overflow'的文档。我可以在这里申请什么查询?

3 个答案:

答案 0 :(得分:1)

尝试$objectToArray将对象转换为数组,如果使用mongo 3.6 +

,则计算键数
db.cols.aggregate(
  [
    {$addFields: {count : {$size : {$ifNull : [{$objectToArray : "$attempts"}, []]}}}},
    {$match: {count : {$gt : 1}}},
    {$project: {count : 0}}
  ]
)

答案 1 :(得分:0)

对单个管道使用 $redact

db.collection.aggregate([
    {
        "$redact": {
            "$cond": [
                {
                    "$gt": [
                        { "$size": { 
                            "$objectToArray": {
                                "$ifNull": [
                                    "$attempts",
                                    { }
                                ]
                            }
                        } },
                        1
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

答案 2 :(得分:0)

attempts转换为数组$unwind,然后使用$sortByCount完成所有工作..

db.collection_name.aggregate( [ 
{ $addFields : { array : { $objectToArray : "$attempts"} } },
{ $unwind : "$array" },  
{ $sortByCount : "$username" },
{ $match : { count : { $gte : 2 } } }
])

输出:

{
    "_id" : "stack",
    "count" : 2
}