mongodb中其他两列中的列



我有一个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和聚合的内容,但从我所读到的内容来看,我认为它不适合我的需求。

有办法做到这一点吗?

您可以使用$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"定义为数组本身,因为内容是"字面上"定义的,不能替换变量。

因此,虽然你不能只是将其他字段的值替换为元素,但你可以用这种方式玩。

当然,对于MongoDB 2.6及更高版本,还有一种更简单的方法可以做到这一点,使用$setUnion运算符:

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

因此,首先将"x"one_answers"y"字段本身形成为数组,然后使用$setUnion将这些内容合并到一个数组中,因为该操作符将多个数组作为其参数。

这里的问题是,我不会依赖排序,因为这被认为不是"严格"的"数组",并且从CTO的口中来看,"一个集合不被认为是以任何方式排序的"

相关内容

  • 没有找到相关文章

最新更新