MongoDB对嵌入式文档的操作

时间:2017-05-20 20:02:04

标签: mongodb

鉴于 marketlist 集合中的以下文档:

{
  "_id": OjectId(...),
  "user": 'myName',
  "marketList: [
    {
      "marketName": "Ralphs",
      "shoppingList: [
        { itemName: "cookies", isCrossed: false },
        { itemName: "bananas", isCrossed: true }
      ]   
    }
  ]
}

你好吗:
1)$拉出市场的市场清单?
以下内容与文档匹配,但不会修改任何内容:

db.marketlist.update(
{
  user: 'myName'
},
{ $pull: { marketList: {marketName: 'Ralphs'}}})

2)$将一个项目从shoppingList中拉出(不将整个市场文档拉出来)
以下内容无效,甚至在命令行上都没有返回消息

db.marketlist.update(
{
  user: 'myName'
},
{$pull: {marketList: {shoppingList: { itemName: 'cookies'}}}})

根据关于$ pull运算符的mongoDB文档,#1中提出的解决方案应该可以胜任。

至于#2,我完全迷失了。在任何一种情况下对我所做错的任何见解都非常感激。

2 个答案:

答案 0 :(得分:0)

你可以做这样的事情

db.getCollection('users').update(
{
user: 'myName'
},
{$pull: {'marketList.0.shoppingList': { "itemName": 'cookies'}}})

这会将一个项目从shoppingList中拉出,并将字段itemName与我们指定的值匹配(" cookies"在这种情况下)

答案 1 :(得分:0)

由于mongodb的位置运算符不能代表多于1个匹配元素,因此需要重新构建以不嵌套数组的方式存储数据的方式。一种可能的解决方案是嵌套对象:

{
  "_id": OjectId(...),
  "user": 'myName',
  "marketList: [
    {
      "marketName": "Ralphs",
      "shoppingList:{
        "cookie": { itemName: "cookies", isCrossed: false },
        "bananas": { itemName: "bananas", isCrossed: true }
      }   
    }
  ]
}