【问题标题】:Insert Into Array of object MongoDB插入对象 MongoDB 的数组
【发布时间】:2018-06-06 10:59:42
【问题描述】:

我有

{
    "_id" : ObjectId("5a25af80d2c4dd065991dccc"),
    "username" : "abc@gmail.com",
    "password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
    "role" : "Admin",
    "__v" : 0,
    "list" : [ 
        {
            "name" : "We",
            "arr" : [ 
                "5a26d554677475818a795f75", 
                "5a395bb0976d5304c07f7dd4"
            ]
        }, 
        {
            "name" : "sandeep",
            "arr" : [ 
                "5a26d554677475818a795f75"
            ]
        }
    ]
}

我想在 list.arr 中添加一个元素,其中 name = 'we' 并且仅在元素不存在时添加

我如何执行这个查询。

【问题讨论】:

  • 我也面临同样的问题
  • 你无法通过单个查询来实现这一点,因为这是嵌套的文档数组。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

如果我正确理解了您的问题,您想将 name 字段与 we 键匹配,并且仅在 arr 存在时更新它?,您必须使用 elemMatch 来获取正确的文档

db.test.update({ list: { $elemMatch: { name: "We" , arr: { $nin: [ "valuette" ] }} } }, {  $push: { "list.$.arr": "valuette" } } );

“list.$.arr”中的$ 匹配与name 字段与we 值匹配的指定索引

更新:回答 OP 问题

【讨论】:

  • 数组里面的元素是否存在
  • 如果数组中不存在该元素我想推
  • 好的,检查新的更新,它解决了你的问题,$nin 操作员检查 valuette 是否不在 arr 数组中,然后更新
【解决方案2】:

初始数据库结构

> db.collection.find().pretty()
{
    "_id" : ObjectId("5a25af80d2c4dd065991dccc"),
    "username" : "abc@gmail.com",
    "password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
    "role" : "Admin",
    "__v" : 0,
    "list" : [
        {
            "name" : "We",
            "arr" : [
                "5a26d554677475818a795f75",
                "5a395bb0976d5304c07f7dd4"
            ]
        },
        {
            "name" : "sandeep",
            "arr" : [
                "5a26d554677475818a795f75"
            ]
        }
    ]
}

查询已执行

> db.collection.update({ list: { $elemMatch: { name: "We" , arr: {$nin: ["55555555555555555"]} } } }, {  $push: { "list.$.arr": "55555555555555555" } } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

新的数据库结构

> db.collection.find().pretty()
{
    "_id" : ObjectId("5a25af80d2c4dd065991dccc"),
    "username" : "abc@gmail.com",
    "password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
    "role" : "Admin",
    "__v" : 0,
    "list" : [
        {
            "name" : "We",
            "arr" : [
                "5a26d554677475818a795f75",
                "5a395bb0976d5304c07f7dd4",
                "55555555555555555"
            ]
        },
        {
            "name" : "sandeep",
            "arr" : [
                "5a26d554677475818a795f75"
            ]
        }
    ]
}

再次执行相同的查询

> db.collection.update({ list: { $elemMatch: { name: "We" , arr: {$nin: ["55555555555555555"]} } } }, {  $push: { "list.$.arr": "55555555555555555" } } )
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

再次检查数据库结构

> db.collection.find().pretty()
{
    "_id" : ObjectId("5a25af80d2c4dd065991dccc"),
    "username" : "abc@gmail.com",
    "password" : "$2a$10$ptFyLKtyyrL5gMYdXS6wV.HLUA4Py5iudMJDldf5qsHFS4.9TPCyy",
    "role" : "Admin",
    "__v" : 0,
    "list" : [
        {
            "name" : "We",
            "arr" : [
                "5a26d554677475818a795f75",
                "5a395bb0976d5304c07f7dd4",
                "55555555555555555"
            ]
        },
        {
            "name" : "sandeep",
            "arr" : [
                "5a26d554677475818a795f75"
            ]
        }
    ]
}

未发现任何更改

【讨论】:

  • @SandeepRanjan 我会再次检查并尽快更新上述内容
  • @SandeepRanjan 请检查查询并通知
【解决方案3】:

通过使用这个嵌套查询,我解决了这个问题。 我是用 Node JS 做的

router.post('/prevList', (req, res) => {
  User.update({'_id':req.user.id, list: { $elemMatch: { name: req.body.name } } },{  $addToSet: { "list.$.arr": {$each: req.body.arr} } },function(err,data) {
    console.log(data);
    res.send(data)
  });
});

这里

req.body: {name:'we',arr:["5a395bb0976d5304c07f7dd4"]}

req.user.id 是身份验证 ID。

希望这对大家也有帮助。

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2021-10-25
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多