在mongoDB中查找JSON对象

时间:2014-12-14 18:05:17

标签: json mongodb mongodb-query

我正在尝试使用构建的查询来查找对象,它只是不起作用.. 我的JSON文件是这样的:

{   "Text1":
    {
        "id":"2"
    },
    "Text2":
    {
       "id":"2,3"
    },
    "Text3":
    {
       "id":"1"
    }
}

我写这个db.myCollection.find({"id":2}) 它没有找到任何东西。 当我写db.myCollection.find()时,它会显示所有数据。

任何人都知道如何正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

很难更改数据结构,但是您只需要匹配的子文档,而不知道目标子文档在哪里(例如查询应该在Text1Text2,...)有一个很好的数据结构:

{
    "_id" : ObjectId("548dd9261a01c68fab8d67d7"),
    "pair" : [ 
        {
            "id" : "2",
            "key" : "Text1"
        }, 
        {
            "id" : [ 
                "2", 
                "3"
            ],
            "key" : "Text2"
        }, 
        {
            "id" : "1",
            "key" : "Text3"
        }
    ]
}

,您的查询是:

db.myCollection.findOne({'pair.id' : "2"} , {'pair.$':1, _id : -1}).pair // there is better ways (such as aggregation instead of above query)

结果你会得到:

{
    "0" : {
        "id" : "2",
        "key" : "Text1"
    }
}

更新1(新手方式)

如果您希望所有文档不仅仅使用此

var result = [];
db.myCollection.find({'pair.id' : "2"} , {'pair.$':1, _id : -1}).forEach(function(item)
{
    result.push(item.pair);
});

// the output will be in result

更新2

使用此查询获取所有子文档

db.myCollection.aggregate
(
   { $unwind: '$pair' },
   { $match : {'pair.id' : "2"} }
).result

它产生输出

{
    "0" : {
        "_id" : ObjectId("548deb511a01c68fab8d67db"),
        "pair" : {
            "id" : "2",
            "key" : "Text1"
        }
    },
    "1" : {
        "_id" : ObjectId("548deb511a01c68fab8d67db"),
        "pair" : {
            "id" : [ 
                "2", 
                "3"
            ],
            "key" : "Text2"
        }
    }
}

答案 1 :(得分:2)

由于您的查询在子文档中指定了一个字段,因此这将起作用。请参阅.find()文档。

db.myCollection.find({"Text1.id" : "2"}, {"Text1.id": true})
{ "_id" : ObjectId("548dd798e2fa652e675af11d"), "Text1" : { "id" : "2" } }

如果查询在“Text1”或“Text2”上,那么在接受的答案中提到的最好的事情就是更改文档结构。这可以使用"Bulk" API轻松完成。

var bulk = db.mycollection.initializeOrderedBulkOp(),
    count = 0;

db.mycollection.find().forEach(function(doc) { 
    var pair = []; 
    for(var key in doc) {     
        if(key !== "_id") { 
            var id = doc[key]["id"].split(/[, ]/); 
            pair.push({"key": key, "id": id}); 
        }
    } 
    bulk.find({"_id": doc._id}).replaceOne({ "pair": pair });  
    count++; if (count % 300 == 0){ 
        // Execute per 300 operations and re-Init
        bulk.execute();     
        bulk = db.mycollection.initializeOrderedBulkOp();
    } 
})

// Clean up queues
if (count % 300 != 0 )
    bulk.execute();  

您的文档现在如下所示:

{
        "_id" : ObjectId("55edddc6602d0b4fd53a48d8"),
        "pair" : [
                {
                        "key" : "Text1",
                        "id" : [
                                "2"
                        ]
                },
                {
                        "key" : "Text2",
                        "id" : [
                                "2",
                                "3"
                        ]
                },
                {
                        "key" : "Text3",
                        "id" : [
                                "1"
                        ]
                }
        ]
}

运行以下查询:

db.mycollection.aggregate([
    { "$project": { 
        "pair": {
            "$setDifference": [
                { "$map": {
                    "input": "$pair", 
                    "as": "pr", 
                    "in": { 
                        "$cond": [
                            { "$setIsSubset": [ ["2"], "$$pr.id" ]}, 
                            "$$pr", 
                            false
                        ]
                    }
                }}, 
                [false]
            ]
        }
    }}
])

返回:

{
        "_id" : ObjectId("55edddc6602d0b4fd53a48d8"),
        "pair" : [
                {
                        "key" : "Text1",
                        "id" : [
                                "2"
                        ]
                },
                {
                        "key" : "Text2",
                        "id" : [
                                "2",
                                "3"
                        ]
                }
        ]
}