从同一个集合中检索两个值

时间:2014-03-21 10:33:32

标签: mongodb aggregation-framework

我有这个系列

{    
    "name" : "users",
    "value" : [ 
        "foo", 
        "bar", 
        "buz"
    ]
}

{
    "name" : "languages",
    "value" : [ 
        "fr", 
        "en", 
        "jp"
    ]
}

我想检索两个值的数组并返回类似这样的内容

{
valueUser['foo','bar','buz'],
languages['fr','en','jp'],
}

我要做两个查询?或者我可以做一个查询吗?

4 个答案:

答案 0 :(得分:1)

更多地使用聚合,但这非常复杂。所以最好每个阶段都要看看发生了什么。

db.collection.aggregate([
    { "$project": {
        "valueUser": { "$cond": [
            { "$eq": [ "$name", "users" ] },
                "$value",
                 [false]        
        ]},
        "languages": { "$cond": [
            { "$eq": [ "$name", "languages" ] },
                "$value",
                 [false]
        ]}
    }},
    { "$unwind": "$valueUser" },
    { "$unwind": "$languages" },
    { "$group": {
        "_id": null,
        "valueUser": { "$push": "$valueUser" },
        "languages": { "$push": "$languages" }
    }},
    { "$unwind": "$valueUser" },
    { "$match": { "valueUser": { "$ne": false } } },
    { "$group": { 
        "_id": "$languages",
        "valueUser": { "$push": "$valueUser" }
    }},
    { "$unwind": "$_id" },
    { "$match": { "_id": { "$ne": false } } },
    { "$group": { 
        "_id": "$valueUser",
        "languages": { "$push": "$_id" }
    }},
    { "$project": {
        "_id": 0,
        "valueUser": "$_id",
        "languages": 1
    }}
])

这样就可以为您提供如何到"拆分"的基本概念。文件中的字段。

可能在这里你需要考虑你的用例,因为这个过程非常复杂。

答案 1 :(得分:0)

您无法在示例中获得您想要的结果。但是你可以在一个查询中获取数据 这样:

db.collection.find({}, {name : true, value : true, _id : false})

结果将是:

[
    { "name" : "users", "value" : [ "foo", "bar", "buz" ] }
    { "name" : "languages", "value" : [ "fr", "en", "jp" ] }
]

认为这会对你有所帮助。

答案 2 :(得分:0)

您希望使用聚合框架来包含所有文档中的值:

db.col.aggregate([
  { $group: { _id: "$name", values: { $addToSet: "$value" } } },
  { $project : { _id: 0, name: "$_id", values: 1 }}
])

对于这样的集合:

{"name" : "users", "value" : ["foo", "bar", "buz"]},
{"name" : "users", "value" : ["bif", "bar", "nerf"]},
{"name" : "languages", "value" : [ "fr", "en", "jp"]}

结果就是这样。

[
    { "name" : "users", "value" : [ "foo", "bar", "buz", "bif", "nerf" ] }
    { "name" : "languages", "value" : [ "fr", "en", "jp" ] }
]

答案 3 :(得分:0)

您可以使用

获取与用户和语言相对应的数据
 db.collection.find({},{_id:0})

结果将是

[ { "name" : "users", "value" : [ "foo", "bar", "buz" ] } { "name" : "languages", "value" : [ "fr", "en", "jp" ] } ]

如果您想要检索问题中提到的方式,那么您需要以这种方式插入

db.collection.insert({"name":"users", "valueUser":["foo","bar","buz"]}
db.collection.insert({"name":"languages", "valueLanguages":["fr","en","jp"]})

然后像这样检索数据

db.collection.find({},{_id:0,name:0})

结果将是

{ "valueUser" : [ "foo" , "bar" , "buzz" ] }
{ "valueLanguages" : [ "fr" , "en" , "jp" ] }