【问题标题】:MongoDB shell, $pop works weirdlyMongoDB shell,$pop 工作异常
【发布时间】:2017-01-03 03:07:39
【问题描述】:

我正在学习 MongoDB,我决定尝试使用 $pop 进行一些小练习:

MongoDB Enterprise > db.produits.insert({compteur: 100001, tab:['a','b','c']})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$push: {tab: 'd'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c", "d" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$pop:{tab:1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$push:{tab:['d', 'e', 'f', 'g']}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c", [ "d", "e", "f", "g" ] ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$pop:{tab:3}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }

我不明白逻辑:

最后一次pop删除了数组中的数组,但是为什么呢?

我要求弹出 3,我认为它可以:

1 - 在选项卡内弹出选项卡中的最后 3 个条目(即“e”、“f”和“g”)

2 - 将表格作为单个元素弹出,然后弹出之前的 2 元素(所以 "b" 和 "c")

我在这里,我不明白发生了什么:/

【问题讨论】:

  • 哈哈,我在职业生涯中发现的第一个错误。我很自豪:P
  • 我不认为这是一个错误。由于tab 字段中的最后一项是数组,因此db.produits.update({compteur: 100001}, {$pop:{tab:3}}); 操作正确弹出最后一个元素(即数组)。 OP 正在寻找的操作可能是db.produits.update({compteur: 100001}, {$pop:{"tab.3":-1}}); 弹出嵌入数组"d" 中的第一个元素,或者db.produits.update({compteur: 100001}, {$pop:{"tab.3":1}}); 弹出最后一个"g"
  • 当我要求弹出最后三个元素时,我不明白只删除一个 4 元素数组的逻辑:/
  • $pop 运算符删除数组的第一个或最后一个元素,本例中的数组是一个堆栈。我想你在这里寻找$slice 运算符。
  • 好的,我们开始了。 $pop 不会删除超过 1 个元素。所以 3 与 1 作为一个值被视为相同。

标签: javascript arrays mongodb


【解决方案1】:

我不认为这是一个错误,因为这是 $pop 运算符的预期行为。它删除数组的第一个或最后一个元素,在这种情况下,数组是一个堆栈,永远不会删除超过 1 个元素。所以 3 与 1 作为值被视为相同(感谢@JohnnyHK 的引用)。

由于tab域最后一项是数组,所以操作

db.produits.update({compteur: 100001}, {$pop:{tab:3}}); 

正确弹出最后一个元素(即数组)。

你要找的操作大概是

db.produits.update({compteur: 100001}, {$pop:{"tab.3":-1}});

弹出嵌入数组“d”中的第一个元素,或

db.produits.update({compteur: 100001}, {$pop:{"tab.3":1}});

弹出最后一个“g”。

我想您可能正在寻找 $slice 运算符来“弹出”多个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多