mongodb中其他两列的列

时间:2014-04-23 16:45:20

标签: mongodb mongodb-query aggregation-framework database

我有一个mongodb集合,其记录与此类似......

{
   id:'8345344',
   x:'-33.2315',
   y:'-53.53453'
}

我需要查询我的数据库,但查询由其他数据组成的字段。 例如......

{
   id:'8345344',
   x:'-33.2315',
   y:'-53.53453',
   newField:['-33.2315', '-53.53453'] //Values of x and y of this record
}

此字段仅用于查询,不应保存。

我在mongodb中看到了关于$ project和aggregation的一些内容,但从我读过的内容来看,我认为它不符合我的需求。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

您可以使用$project执行此操作,但这并不像您想象的那样直截了当:

db.combine.aggregate([
    { "$project": {
        "x": 1,
        "y": 1,
        "tag": { "$cond": [ true, [ "x", "y" ], 0 ] }
    }},
    { "$unwind": "$tag" },
    { "$project": {
        "newField": { "$cond": [ 
            { "$eq": [ "$tag", "x" ] },
            "$x",
            "$y"
        ]}
    }},
    { "$group": {
        "_id": "$_id",
        "newField": { "$push": "$newField" }
    }}
])

使用MongoDB 2.6,有一个新的$literal运算符可以在第一个项目阶段删除$cond的模糊用法

db.combine.aggregate([
    { "$project": {
        "x": 1,
        "y": 1,
        "tag": { "$literal": [ "x", "y" ] }
    }},
    { "$unwind": "$tag" },
    { "$project": {
        "newField": { "$cond": [ 
            { "$eq": [ "$tag", "x" ] },
            "$x",
            "$y"
        ]}
    }},
    { "$group": {
        "_id": "$_id",
        "newField": { "$push": "$newField" }
    }}
])

$literal实际上解释了为什么你需要这种过程并且不能仅仅将“newField”定义为一个数组,因为内容是“字面上”定义的并且不替换变量。

因此,虽然您不能将其他字段中的值替换为可以这种方式播放的元素。

当然,使用$setUnion运算符,甚至可以使用MongoDB 2.6及更高版本执行此操作:

db.combine.aggregate([
    { "$group": {
        "_id": "$_id",
        "x": { "$push": "$x" },
        "y": { "$push": "$y" }
    }},
    { "$project": {
        "newField": { "$setUnion": [ "$y", "$x" ] }
    }}
])

首先,将“x”和“y”字段形成为数组本身然后使用$setUnion 这些内容合并为单个数组,因为该运算符需要多个数组因为它的论点。

这里的问题是我不会依赖订购,因为这被认为不是“严格地”是一个“阵列”,并且从CTO的口中,“一套不被认为是以任何方式订购”