在MongoDB的聚合管道中,如何重复所有字段键并设置新值在$project阶段?

huangapple go评论98阅读模式
英文:

How to repeat all fields key and set the new value in $project stage in aggregate mongodb?

问题

我有一个模式模型,其中有许多字段,就像下面的示例一样,我想将suggest_foo中的根字段克隆到聚合的$project阶段,而不必手动重写这些字段,然后根据我的逻辑设置这些字段的新值。

示例:

  • 模式模型:
  1. const fooSchema = new Schema({
  2. suggest_foo: {
  3. foo1: String,
  4. foo2: String,
  5. foo3: String,
  6. foo4: String,
  7. foo5: String,
  8. }
  9. // ...
  10. })
  • 种子数据:
  1. {
  2. suggest_foo: {
  3. foo1: 'Foo1',
  4. foo2: 'Foo2',
  5. foo3: 'Foo3',
  6. foo4: 'Foo4',
  7. foo5: 'Foo5',
  8. }
  9. }
  • 聚合查询代码:
  1. fooSchema.aggregate([
  2. // ...
  3. {
  4. $project: {
  5. // 我想要克隆suggest_foo中的根字段(例如:foo1、foo2、foo(n))到这里。
  6. }
  7. }
  8. ])

我期望的输出结果如下:

  1. {
  2. foo1: 'Foo1 maybe you like',
  3. foo2: 'Foo2 maybe you like',
  4. foo3: 'Foo3 maybe you like',
  5. foo4: 'Foo4 maybe you like',
  6. foo5: 'Foo5 maybe you like',
  7. }
英文:

I have a schema model with so many fields like below example, I want to clone root field in suggest_foo to $project stage of aggregation without having to manually rewrite those fields and then set those fields with new value as my logic.

Example:

  • schema model:

    1. const fooSchema = new Schema({
    2. suggest_foo:
    3. foo1: String,
    4. foo2: String,
    5. foo3: String,
    6. foo4: String,
    7. foo5: String,
    8. }
    9. ...
    10. })
  • seeds data:

    1. {
    2. suggest_foo: {
    3. foo1: 'Foo1',
    4. foo2: 'Foo2',
    5. foo3: 'Foo3',
    6. foo4: 'Foo4',
    7. foo5: 'Foo5',
    8. }
    9. }
  • aggregate query code:

    1. fooSchema.aggregate([
    2. ...
    3. {
    4. $project: {
    5. // I want to clone root in suggest_foo (eg: foo1, foo2, foo(n)...) to be here.
    6. }
    7. }
    8. ])

My output result that I expected look like:

  1. {
  2. foo1: 'Foo1 maybe you like',
  3. foo2: 'Foo2 maybe you like',
  4. foo3: 'Foo3 maybe you like',
  5. foo4: 'Foo4 maybe you like',
  6. foo5: 'Foo5 maybe you like',
  7. }

答案1

得分: 1

一种选择是使用$replaceRoot$arrayToObject$objectToArray,因为这将允许您在循环中操作数组:

  1. db.collection.aggregate([
  2. {$replaceRoot: {
  3. newRoot: {
  4. $arrayToObject: {
  5. $map: {
  6. input: {$objectToArray: "$suggest_foo"},
  7. in: {
  8. v: {$concat: ["$$this.v", "也许你会喜欢"]},
  9. k: "$$this.k"
  10. }
  11. }
  12. }
  13. }
  14. }}
  15. ])

播放示例上查看它是如何工作的。

英文:

One option is to use $replaceRoot with $arrayToObject and $objectToArray as this will allow you to manipulate array in a loop:

  1. db.collection.aggregate([
  2. {$replaceRoot: {
  3. newRoot: {
  4. $arrayToObject: {
  5. $map: {
  6. input: {$objectToArray: "$suggest_foo"},
  7. in: {
  8. v: {$concat: ["$$this.v", " maybe you like"]},
  9. k: "$$this.k"
  10. }
  11. }
  12. }
  13. }
  14. }}
  15. ])

See how it works on the playground example

huangapple
  • 本文由 发表于 2023年1月8日 01:27:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/75042377.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定