我有一个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的一些内容,但从我读过的内容来看,我认为它不符合我的需求。
有办法做到这一点吗?
答案 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的口中,“一套不被认为是以任何方式订购”