【问题标题】:Find in subdocument MongoDb在子文档 MongoDb 中查找
【发布时间】:2016-04-18 21:42:15
【问题描述】:

我需要先通过 _id 找到文档。 然后在文档中查找子文档中的时间字段大于参数lastTime

var filter = builder.Eq("_id", symbol) & builder.Gt("Update.Time", lastTime);
var result = await MongoDb.CollectionName.Find(filter).ToListAsync();

此示例的结果为 0。

如何编写这个查询?我需要获取此子文档“更新”或最后 3 个子子文档

文档结构如下

{
  {"_id", symbol},
  {"Update", [
              {"_id", number}, {"Time", sometime}, {"Version", versionNumber}, 
              {"_id", number}, {"Time", sometime}, {"Version", versionNumber},
              {"_id", number}, {"Time", sometime}, {"Version", versionNumber},
              {"_id", number}, {"Time", sometime}, {"Version", versionNumber},}
             ]
}

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    如果 mongodb 控制台可以运行示例:

    > db.doc.save({
       "_id":"123", 
       "update":[
           {"_id":'1', "time":'345', "Version":'3'}, 
           {"_id":'2', "time":'234', "Version":'4'}
        ]
    })
    > db.doc.findOne( { _id:"123", "update.time":{ $gt: 344 } } )
    

    那么对于 C# 可以试试吗?

    var collection = _database.GetCollection<BsonDocument>("name");
    var filter = Builders<BsonDocument>.Filter.Gt("update.time", 344);
    var result = await collection.Find(filter).ToListAsync();
    

    这个example

    UPD 这可以是:

    var collection = _database.GetCollection<BsonDocument>("name");
    var builder = Builders<BsonDocument>.Filter;
    var filter  = builder.Eq("_id", id) & builder.Gt("update.time", 344);
    var result  = await collection.Find(filter).ToListAsync();
    

    【讨论】:

    • 感谢您的回复。我实际上看到了这个例子。我的问题是我需要一个 id 的第一个身份。因为文件太多。首先我需要通过 id 找到文档,然后在子文档中搜索。
    • 您的第二个示例写在我的问题中。它不起作用。
    【解决方案2】:

    尝试使用 lambda 表达式:

    var lastTime = 1;
    var result = collection.Find(x => x.Update.Contains(lastTime));
    

    【讨论】:

    • 我们不鼓励在这里仅使用代码的答案。请编辑您的答案并解释这如何以及为什么回答问题。
    • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • 不幸的是,这个具体的答案并没有试图回答这个问题。 OP 尝试过滤大于特定时间的子文档。
    猜你喜欢
    • 2021-07-25
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多