【问题标题】:Modifying the $ positional operator修改 $ 位置运算符
【发布时间】:2012-06-14 20:02:42
【问题描述】:

我正在关注the example in the docs

> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
  "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }

> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )

> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
  "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

这显示了如何搜索 Joe 的投票计数并增加它。我想要完成的是在查询 Joe 时增加 Jane 的投票计数。在我的例子中,comments 是一个长度始终为 2 的数组。也许最好用我当前的(非工作)语法来展示它:

t.update( {'comments.by':'joe'}, {$inc:{'comments[1-$].votes':1}}, false, true )

我认为$ 在这里应该是0,因为 Joe 在数组中排在第一位。为了获得另一个数组索引,我假设 1-$ 可以完成这项工作,但事实并非如此。

如何匹配另一个数组元素而不是查询的元素?

【问题讨论】:

    标签: arrays mongodb matching positional-operator


    【解决方案1】:

    不,这是不可能的。 $ 指向数组中的第一个匹配元素。您无法构建对与该匹配元素相关的其他元素的引用。不过,您始终可以使用绝对引用 (comments.1.votes)。

    【讨论】:

    • 嗯,mongo有很多限制,但也许我没有正确使用它。我想要实现的目标听起来并不太复杂。有没有办法在mongo中做这样的事情?
    • 我猜,您的数据与帖子和 cmets 无关,对吧?你想达到什么目的?一定有更惯用的方式。
    • True :) 基本上我正在尝试创建一个简单的“hello world”聊天应用程序,其中发布聊天消息会增加 other 聊天的unreadMessages 计数用户。我正在查询聊天室 id 和 current 用户 id(这样没有人可以更新那个房间),但是使用 $ 运算符我只能增加当前的 unreadMessages用户,没有意义。
    • 我会发送几个单独的更新。另一种方法是首先获取整个文档,计算新数组(使用更新值)并发送它。但这不是原子的。尝试第一个,它应该很好用。
    • 另一种选择是重新考虑您的架构并将该哈希数组转换为嵌套哈希结构。然后您将通过名称而不是索引来引用用户,并且应该可以一次更新多个用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多