我们一直在努力进行数小时的查询,这对我们来说似乎很容易,而且我们是通过Robo 3T进行的...现在的问题是将其转换为C#,但我们找不到方法,我们没有甚至不明白为什么它不起作用。
我们有以下查询:
RewriteEngine on
RewriteCond % {REQUEST_FILENAME} !-f
RewriteCond % {REQUEST_FILENAME} !-d
RewriteRule ^ 404.html
ErrorDocument 404 /404.html
现在我们的查询成功了,我们尝试将其转换为c#,到目前为止,我们已经达到了这一点,我们还真的不知道问题的根源。
db.getCollection('UserCollection').update({"User.Contacts._id": ObjectId("xxx")},
{
$pull: {
"User.Contacts": {
"_id": {$in:[ObjectId("xxx")]}
}
}
})
在这里您看到public Task PullSocialInfoAsync(ObjectId contactId)
{
var fieldName = nameof(UserContainer.User) + "." + nameof(UserContainer.User.Contacts) + "._id";
var filter = NewFilterBuilder().Eq(fieldName, contactId);
var update = new BsonDocument("$pull", new BsonDocument(nameof(UserContainer.User) + "." + nameof(UserContainer.User.Contacts), new BsonDocument("_id", new BsonDocument("$in", new BsonArray() { contactId }))));
return GetCurrentCollection().FindOneAndUpdateAsync(filter, update);
}
,但我们也尝试过FindOneAndUpdateAsync
,即使我们将字符串查询与Robo上的查询匹配,我们也多次更改了BsonArray的初始化但没有成功。 3T
基于上述C#查询,我们得到以下输出:
UpdateAsync
。最有趣的部分是,如果我复制粘贴..效果很好
有什么想法吗?
谢谢!
答案 0 :(得分:1)
如果我正确理解了您的要求,那么您就需要pullFilter
。
var filter = Builders<UserCollection>.Filter.Where(u => u.User.Contacts.Any(c => c._Id == contactID));
var update = Builders<UserCollection>.Update.PullFilter(u => u.User.Contacts, c => c._Id == contactID);
collection.UpdateOne(filter, update);
这是测试任何人是否有兴趣的完整程序。
using MongoDB.Entities; // PM> Install-Package MongoDB.Entities
using MongoDB.Bson;
using System.Linq;
namespace StackOverflow
{
public class Program
{
public class UserCollection : Entity
{
public User User { get; set; }
}
public class User
{
public Contact[] Contacts { get; set; }
}
public class Contact
{
public ObjectId _Id { get; set; }
}
private static void Main(string[] args)
{
new DB("test");
var contactID = ObjectId.GenerateNewId();
(new UserCollection
{
User = new User
{
Contacts = new[]
{
new Contact { _Id = ObjectId.GenerateNewId()},
new Contact { _Id = contactID}
}
}
}).Save();
DB.Update<UserCollection>()
.Match(u => u.User.Contacts.Any(c => c._Id == contactID))
.Modify(b => b.PullFilter(u => u.User.Contacts, c => c._Id == contactID))
.Execute();
}
}
}