0

我正在使用 mongo 来存储私人消息,例如我有一个像这样的数组:

{
  "_id": { "$oid" : "520b842005ab0d0000000003" },
  "pmhistory": [
    {
      "sendername": "Tati",
      "preview": "Hey Man!",
    },
    {
      "sendername": "Dan",
      "preview": "Hey Moon!",
    },
    {
      "sendername": "Hellen",
      "preview": "Hello, Im proper!",
    },
  ],
  "user": { "$oid" : "520b842005ab0d0000000002" },
  "userid": "1"
}

如果 Dan 发送一条新消息,我需要将他的数组条目移动到位置 0 (pmhistory[0]) 并更新预览字段。

现在我被迫向数据库发出两个查询,一个带有参数,从数组$pull中取出 Dans 条目,另一个带有将 Dans 条目添加到数组开头的参数。pmhistory$setpmhistory

是否可以使用 1 个查询而不是两个?没有得到have conflicting mods in update,因为我正在改变数组的大小。

4

2 回答 2

1

我认为最简单的方法是首先不依赖数组顺序。我要做的是为每个子文档添加一个附加字段“last_update”,例如:

{
  "_id": { "$oid" : "520b842005ab0d0000000003" },
  "pmhistory": [
    {
      "sendername": "Tati",
      "preview": "Hey Man!",
      "last_updated": 1376581408222,
    },
    {
      "sendername": "Dan",
      "preview": "Hey Moon!",
      "last_updated": 1376581406444,
    },
    {
      "sendername": "Hellen",
      "preview": "Hello, Im proper!",
      "last_updated": 1376581508111,
    },
  ],
  "user": { "$oid" : "520b842005ab0d0000000002" },
  "userid": "1"
}

然后,当 Dan 有新消息时,您可以findAndModify像这样运行:

db.so.findAndModify( { 
    query: { "pmhistory.sendername" : "Dan" }, 
    update: { 
        $set: { "pmhistory.$.last_updated" : (new Date).getTime() } 
    }, 
    new: true 
} );

然后返回:

{
    "_id" : ObjectId("520cf82fd3541122f936f72e"),
    "pmhistory" : [
        {
            "sendername" : "Tati",
            "preview" : "Hey Man!",
            "last_updated" : 1376581408
        },
        {
            "sendername" : "Dan",
            "preview" : "Hey Moon!",
            "last_updated" : 1376581716876
        },
        {
            "sendername" : "Hellen",
            "preview" : "Hello, Im proper!",
            "last_updated" : 1376581508
        }
    ],
    "user" : ObjectId("520b842005ab0d0000000002"),
    "userid" : "1"
}

然后在您的应用程序中,在显示部分,只需确保您按此新last_updated字段降序排列即可。

于 2013-08-15T15:50:48.863 回答
0

您可以将 $push 与 $slice 结合使用来固定数组大小并清除最后一个元素。

http://docs.mongodb.org/manual/reference/operator/slice/

于 2013-08-15T11:36:58.920 回答