mongodb - 查询mongodb中嵌入文档的数组

标签 mongodb embedded-documents

我在编写需要将给定值与数组中所有 嵌入式文档中的特定字段进行比较的查询时遇到了一些麻烦。我将举一个例子来使这个问题不那么抽象。

假设我想使用 MongoDB 来存储我网络上的用户在不同的在线搜索引擎中输入的最后查询。集合中的条目将具有如下结构:

{
    '_id' : 'zinfandel', 
    'last_search' : [
        {
            'engine' : 'google.com',
            'query' : 'why is the sky blue' 
        },
        {
            'engine' : 'bing.com', 
            'query' : 'what is love'
        },
        {   'engine' : 'yahoo.com',
            'query' : 'how to tie a tie'
        }
    ]
}

现在假设用户 用户名 在某个引擎 中输入了一个新的查询。将此查询存储在数据库中的代码需要查明是否已经存在用户使用的引擎的条目。如果是,则此条目将用新查询更新。如果没有,则应创建一个新条目。我的想法是仅当给定引擎没有条目时才执行 $push,否则执行 $set。为此,我试着这样写我的推送:

db.mycollection.update(
    { '_id' : username , search.$.engine : { '$ne' : engine } },
    { '$push' : { 'search.$.engine' : engine, 'search.$.query' : query } }
) 

但是,即使给定的引擎 已经有一个条目,这也会推送一个新的嵌入文档。问题似乎是 $ne 运算符不能像我期望的那样处理数组。我需要的是一种确保数组中没有一个嵌入文档具有与指定引擎匹配的“引擎”条目的方法。

有没有人知道如何做到这一点?请告诉我是否需要进一步澄清问题......

最佳答案

您可以使用以下命令将项目插入数组:

db.mycollection.update({
    _id: "zinfandel", 
    "last_search.engine": {
        $nin: ["notwellknownengine.com"]
    }
}, {
    $push: {
        "last_search": {
            "engine" : "notwellknownengine.com", 
            "query" : "stackoveflow.com"
        }
    }
});

关于mongodb - 查询mongodb中嵌入文档的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835201/

相关文章:

document - MongoEngine:从嵌入文档获取父文档

java - writeConcern 未在 mongodb 中设置为 Acknowledged

java - mongodb使用java驱动程序比较两个不同的字段

python - 为什么使用 update_one 更新记录会引发 ValueError?

mongodb - 将嵌入文档插入到 mongodb 文档中的新字段

mongodb - 使用 $set 更新嵌入文档

php - 变更集 Doctrine 事件监听器中的嵌入式文档

node.js - 是否可以使用 mongoDB 和 Node.js 返回多个子文档?

javascript - 我如何使用 Node 异步来获取我的 Mongoose 调用?

python - Django : Using Mongodb with django