我有一个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的口中来看,"一个集合不被认为是以任何方式排序的"