Mongodb在多个匹配中的特定文档上使用findAndModify

Posted

技术标签:

【中文标题】Mongodb在多个匹配中的特定文档上使用findAndModify【英文标题】:Mongodb use findAndModify on specific document among multiple match 【发布时间】:2018-08-01 22:12:13 【问题描述】:

我的文件如下所示

let object = [
    
        id: 4,
        parents:
            [
                1, 2,
            ],
        children: 2
    ,
    
        id: 5,
        parents:
            [
                1, 2,
            ],
        children: 1
    ,
    
        id: 8,
        parents:
            [
                1, 2, 4
            ],
        children: 0
    ,
    
        id: 9,
        parents:
            [
                1, 2, 4
            ],
        children: 0
    ,
    
        id: 10,
        parents:
            [
                1,2,5
            ],
        children:0
    
]

我想使用findAndModify 来更新孩子的价值。它必须是findAndModify,因为我将在多线程环境中工作,因此选择和更新必须在单个事务中进行。

我正在寻找的条件是当“2”包含在parents 数组中并且children 值小于2 时,children 值最高,而父母数量在足够的文档中最低。然后我想增加第一个匹配文档的孩子的价值。

我现在想出的查询如下

let query =
    
        parents:
            
                $elemMatch:2
            ,
        children:
            
                $lt: 2
            
    ;

这足以满足前几个条件,但不幸的是我不知道如何选择出来


    id: 5,
    parents:
        [
            1, 2,
        ],
    children: 1
,


    id: 8,
    parents:
        [
            1, 2, 4
        ],
    children: 0
,

    id: 9,
    parents:
        [
            1, 2, 4
        ],
    children: 0
,

    id: 10,
    parents:
        [
            1,2,5
        ],
    children:0

这是我的查询当前选择的内容。同样,它必须是单个事务,因此不可能写出另一组查询。

至于为什么一定要单笔交易,可以参考这篇帖子How to limit maximum reference of the parental node in mongodb

【问题讨论】:

【参考方案1】:

试试这个

query.findAndModify(
    query:  $and: [  children :$lt : 2 ,  parents:  $size: 2   ] ,
    update:  according to you 
);

【讨论】:

以上是关于Mongodb在多个匹配中的特定文档上使用findAndModify的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB find() 在匹配(字段,值)时返回子文档

Mongodb:在 find() 中使用 $or 时返回匹配的过滤器

Mongodb:在 find() 中使用 $or 时返回匹配的过滤器

匹配 MongoDB 中嵌套子文档的嵌套数组

MongoDB查询以获取与具有多个值的键匹配的所有文档[重复]

在 mongodb 中,如何仅选择文档中与 find() 条件匹配的对象?