【问题标题】:Mongo query (with positional operator) does not work in mongooseMongo 查询(使用位置运算符)在 mongoose 中不起作用
【发布时间】:2015-03-25 07:29:41
【问题描述】:

给定一个带有果园的数据库集合,一个对象如下所示:

{
"orchardId" : ObjectId("5391c137722b051908000000"),
"trees" : [ 
    {
        "name" : "apple",
        "fruits" : []
    }, 
    {
        "name" : "pear",
        "fruits" : [ 
            ObjectId("54c54291d93236150f00004e"), 
            ObjectId("54c542c9d93236150f000062")
        ]
    }
]
}

我想动态地将水果添加到特定的树上。我知道我可以在 mongo 中做到这一点:

db.orchards.update(
    ({"orchardId": ObjectId("5391c137722b051908000000")},
    {"trees" : { $elemMatch: {"name":"apple"}}}),
    { $push: { "trees.$.fruits": ObjectId("54c542c9d900000000001234") }}
)

所以,如果我是对的,这应该是猫鼬中的这个:

orchards.update(
    ({"orchardId": ObjectId.fromString(orchard.id)},
    {"trees" : {$elemMatch: {"name": "apple"}}}),
    {$push: {"trees.$.fruits": ObjectId("54c542c9d900000000001234") }},function(err, data){ ...

然后我收到一条错误消息:[TypeError: Cannot call method 'path' of undefined]

看起来 mongoose 无法处理位置运算符($),因为当我将 $ 更改为 0 时它确实有效。

如何在猫鼬中进行这项工作?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    在您的代码示例中,您应该有括号,所以应该是这样的:

    orchards.update({
        "orchardId": ObjectId(orchard.id),
        "trees": {$elemMatch: {"name": "apple"}}
      },
      {$push: {"trees.$.fruits": ObjectId("54c542c9d900000000001234") }},
      function(err, data){ ...
    

    【讨论】:

    • 感谢您的回答 JohnnyHK!您可以组合对象,这就是我在那里所做的。所以括号是正确的。但是:我发现这在 mongoose 3.8.22 中有效,但不适用于 3.6.15 版本(我最初使用的那个)
    • 当您将两个对象放在括号中时,它将仅计算为第二个对象。至少当我尝试你的代码时是这样的。
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多